我之前使用过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。有什么问题?
答案 0 :(得分:19)
问题在于:
struct Test
{
int x = 0; // <==
Vector2 v;
};
直到最近,默认成员初始值设定项阻止该类成为聚合,因此您无法对它们使用聚合初始化。 Gcc 4.9仍然在这里实现旧规则,而gcc 5使用新规则。
答案 1 :(得分:2)
您在课程定义后和contains()
之后错过了;
。然后你得到了很多错误,显然只考虑了最后一个错误。但是你的编译器很困惑,因为没有定义int x = 0
(由于缺少Vector2
)。
编译:
;
答案 2 :(得分:1)
// 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