web-dev-qa-db-ja.com

{...}を<brace-enclosed initializer list>からstructに変換できませんでした

以前はTDM-GCC-5.10を使用していましたが、4.9 MINGW-GCCに切り替えて、リスト初期化を使用しようとすると奇妙なエラーが発生します。

class Vector2
{
public:
    Vector2(float x, float y)
    {
        this->x = x;
        this->y = y;
    }
    float x = 0.f;
    float y = 0.f;
};

struct Test
{
    int x = 0;
    Vector2 v;
};

int main()
{    
    Test tst = {0,Vector2(0.0f,0.0f)}; //Error
    return 0;
}

エラー:

main.cpp: In function 'int main()':
main.cpp:21:41: error: could not convert '{0, Vector2(0.0f, 0.0f)}' from '<brace-enclosed initializer list>' to 'Test'
         Test tst = {0,Vector2(0.0f,0.0f)}; //Error
                                         ^

両方のコンパイラでC++ 14を使用しました。なにが問題ですか?

15

問題はここにあります:

struct Test
{
    int x = 0; // <==
    Vector2 v;
};

最近まで、デフォルトのメンバー初期化子は、クラスが集合体になることを妨げるので、それらに対して集合体の初期化を使用することはできません。 Gcc 4.9はまだ古いルールを実装していますが、gcc 5は新しいルールを使用します。

20
Barry

クラス定義の後および_;_の後に_int x = 0_を逃しました。次に、多くのエラーが発生し、明らかに最後のエラーのみが考慮されました。しかし、_Vector2_が定義されていないため、コンパイラーは混乱していました(_;_がないため)。

これはコンパイルします:

_int main()
{
    class Vector2
    {
    public:
        Vector2(float x, float y)
        {
            this->x = x;
            this->y = y;
        }
        float x = 0.f;
        float y = 0.f;
    };

    struct Test
    {
        int x;
        Vector2 v;
    };

    Test tst = {0,Vector2(4,5)};
    return 0;
}
_
2
jpo38
// 10.3  lowest common ancestor

// Solution: A brute-force approach is to see if the nodes are in different
// immediate subtrees of the root, or if one of the nodesis the root

#include <bits/stdc++.h>
using namespace std;
template <typename T>
struct Node {
  T data;

  unique_ptr<Node<T>> left;
  unique_ptr<Node<T>> right;
};

struct Status {
  int num_target_nodes;
  //   Node<int>* ancestor;
  unique_ptr<Node<int>> ancestor;
};

Status lcaHelper(unique_ptr<Node<int>>& root, unique_ptr<Node<int>>& node0,
                 unique_ptr<Node<int>>& node1) {
  if (root == nullptr) {
    return {0, nullptr};
  }

  auto l = lcaHelper(root->left, node0, node1);

  if (l.num_target_nodes == 2) return l;

  auto r = lcaHelper(root->right, node0, node1);

  if (r.num_target_nodes == 2) return r;

  int num_target_nodes = l.num_target_nodes + r.num_target_nodes +
                         (root == node0) + (root == node1);

  return {num_target_nodes, num_target_nodes == 2 ? root : nullptr};

  //   return {num_target_nodes, num_target_nodes == 2 ? root.get() :
  //   nullptr};
}

// Node<int>* lca(unique_ptr<Node<int>>& root, unique_ptr<Node<int>>& node0,
//                unique_ptr<Node<int>>& node1) {
unique_ptr<Node<int>> lca(unique_ptr<Node<int>>& root,
                          unique_ptr<Node<int>>& node0,
                          unique_ptr<Node<int>>& node1) {
  return lcaHelper(root, node0, node1).ancestor;
}

int main() {}

私は本から同じような例を試しましたelements of programming interview。それは同じ問題を示しており、上記の答えはこの場合にはあまり当てはまりません。私はgccバージョン8.3.0(Ubuntu 8.3.0-6ubuntu1)でg ++ -std = c ++ 11を使用しています

1
cpchung