C++ C++;:alias members类是如何工作的?
在以下代码中:C++ C++;:alias members类是如何工作的?,c++,class,c++11,reference,alias,C++,Class,C++11,Reference,Alias,在以下代码中: 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 { 公众: prova():a(5){} INTA; }; int main()
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
{
公众:
prova():a(5){}
INTA;
};
int main()
{
std::向量p;
prova obj;
p、 推回(obj);
返回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;
}
class prova:public std::map
{
公众:
prova():a(5){}
INTA;
int&b=a;
};
int main()
{
std::向量p;
prova obj;
p、 推回(obj);
返回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=c++11或-std=gnu++11[默认启用]|
/home/andrea/scaricti/prova.cpp | |在“void”的实例化中
std::vector::_M_insert_aux(std::vector::迭代器,const _Tp&)
[with _Tp=prova;_Alloc=std::分配器;
std::vector::iterator=_gnu_cxx::_normal_iterator;typename std:_vector_base::pointer=prova*]:|
/usr/include/c++/4.8/bits/stl_vector.h | 913 |必须来自“void std::vector::push_back(const value_type&)[带有_Tp=prova;_Alloc=std::alloctor;std::vector::value_type=prova]”|
/home/andrea/Scaricti/prova.cpp | 19 |需要从这里开始|
/home/andrea/scaricti/prova.cpp | 4 |错误:非静态引用成员“int&prova::b”,无法使用默认赋值运算符|
/usr/include/c++/4.8/bits/vector.tcc | 335 |注:此处首先需要合成方法“prova&prova::operator=(const prova&)”
|||==生成失败:1个错误,4个警告(0分钟,0秒))===|
添加警告中建议的-std=g++11没有问题。
如果我删除向量声明,我只得到警告,没有错误。
为什么C++老标准不能做到?引用属性有什么问题?有没有一个系统不用c++11标准就可以做同样的事情?我试着
class prova: public std::map< int,int >
{
public:
prova():a(5),b(a){}
int a;
int &b;
};
class prova:public std::map
{
公众:
prova():a(5),b(a){}
INTA;
国际酒店;
};
但我会犯错误。为什么会这样?谢谢 您会收到警告,因为您的编译器足够聪明,能够了解C++11的语法。在C++中,这样的语法<代码> int和b= a < /C> >在类成员初始化器,并且在以前的标准中,只能用<代码>静态const < /C>变量。C++11放松了这些约束 发件人: 在C++98中,只能使用整型的
静态常量成员
在类中初始化,并且初始值设定项必须是常量
表示这些限制确保我们能够做到这一点
编译时初始化
例如:
C++11的基本思想是允许创建非静态数据成员
在声明的位置初始化(在其类中)。构造函数可以
然后在需要运行时初始化时使用初始值设定项。
考虑:
这相当于:
非静态数据成员初始值设定项是C++11的一项功能。不管怎样,如果你保持自引用,你需要自己编写拷贝cTor和赋值操作符,否则事情会变得混乱。“为什么C++旧的标准不能这么做?”:正如警告中所说的,“非静态数据成员初始化器只能用-STD= C++ 11或-STD= GNU++ 11”。老实说,我不知道为什么这不是一个错误-我不知道编译器在C++11之前的模式下对非静态成员初始值设定项做了什么。而且,从标准模板库继承是有点不赞成的,好吧..但是为什么迭代器会出错@VulpRoSSA:因为从LVald中的代码> PUSHOBACK()/CUT>需要复制元素,并且作为错误状态(授予它被埋入一堆噪声中,这仍然是C++模板错误的一个大问题):“错误:非静态引用成员<代码> It和PROVA::b′<代码>,不能使用默认赋值操作符”。因此,正如T.C.所提到的,为了正确处理引用,您需要定义自己的复制操作。第一个是聚合;第二个不是。谢谢,我不知道。我在我的帖子中删除了对C++14的任何提及;我得到错误:非静态引用成员“int&prova::b”,无法使用默认赋值运算符|@volperossa:不确定,可能是您的编译器。在VS2013为我工作。(我从std::map中删除了继承,但这不重要)
int var = 7;
class X {
static const int m1 = 7; // ok
const int m2 = 7; // error: not static
static int m3 = 7; // error: not const
static const int m4 = var; // error: initializer not constant expression
static const string m5 = "odd"; // error: not integral type
// ...
};
class A {
public:
int a = 7;
};
class A {
public:
int a;
A() : a(7) {}
};