【发布时间】:2014-10-03 21:35:05
【问题描述】:
在以下代码中:
class prova: public std::map< int,int >
{
public:
prova():a(5){}
int a;
};
int main()
{
std::vector<prova> p;
prova obj;
p.push_back(obj);
return 0;
}
它可以正常工作; 如果我添加参考成员
class prova: public std::map< int,int >
{
public:
prova():a(5){}
int a;
int& b=a;
};
int main()
{
std::vector<prova> p;
prova obj;
p.push_back(obj);
return 0;
}
我有
warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]|
/home/andrea/Scaricati/prova.cpp||In instantiation of ‘void
std::vector<_Tp,_Alloc>::_M_insert_aux(std::vector<_Tp, _Alloc>::iterator, const _Tp&)
[with _Tp = prova; _Alloc = std::allocator<prova>;
std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<prova*, std::vector<prova> >; typename std::_Vector_base<_Tp, _Alloc>::pointer = prova*]’:|
/usr/include/c++/4.8/bits/stl_vector.h|913|required from ‘void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = prova; _Alloc = std::allocator<prova>; std::vector<_Tp, _Alloc>::value_type = prova]’|
/home/andrea/Scaricati/prova.cpp|19|required from here|
/home/andrea/Scaricati/prova.cpp|4|error: non-static reference member ‘int& prova::b’, can’t use default assignment operator|
/usr/include/c++/4.8/bits/vector.tcc|335|note: synthesized method ‘prova& prova::operator=(const prova&)’ first required here
|||=== Build failed: 1 error(s), 4 warning(s) (0 minute(s), 0 second(s)) ===|
像警告中建议的那样添加 -std=g++11 没有问题。 如果我删除向量声明,我只会收到没有错误的警告。 为什么 C++ 旧标准做不到?引用属性有什么问题?是否有一个系统可以在不使用 c++11 标准的情况下做同样的事情?我试试
class prova: public std::map< int,int >
{
public:
prova():a(5),b(a){}
int a;
int &b;
};
但我得到了错误。为什么这个?谢谢!
【问题讨论】:
-
非静态数据成员初始化器是 C++11 的一个特性。无论如何,如果您维护自引用,则需要自己编写复制 ctor 和赋值运算符,否则事情会变得一团糟。
-
“为什么 C++ 旧标准不能做到这一点?”:如警告中所述,“非静态数据成员初始化器仅适用于 -std=c++11 或 -std=gnu+ +11”。老实说,我不确定为什么这不是错误 - 我不知道 C++11 之前模式下的编译器对非静态成员初始化器做了什么。
-
好的..但是为什么迭代器出错了?!
-
@volperossa:因为来自左值的
push_back()需要复制元素并作为错误状态(当然 - 它被埋在一堆噪音中;这仍然是 C++ 模板错误的一个大问题): “错误:非静态引用成员'int& prova::b',不能使用默认赋值运算符”。所以,作为 T.C.提到,您需要定义自己的复制操作才能正确处理引用。
标签: c++ class c++11 reference alias