以前は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を使用しました。なにが問題ですか?
問題はここにあります:
struct Test
{
int x = 0; // <==
Vector2 v;
};
最近まで、デフォルトのメンバー初期化子は、クラスが集合体になることを妨げるので、それらに対して集合体の初期化を使用することはできません。 Gcc 4.9はまだ古いルールを実装していますが、gcc 5は新しいルールを使用します。
クラス定義の後および_;
_の後に_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;
}
_
// 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を使用しています