我使用这个非常简单的类而不使用任何继承。
class A
{
int a;
int b;
public:
A(int x, int y) { a = x; b = y;}
A() :A(0,0){};
~A(){};
} ;
int main ()
{
A a1, a2(5, 7) ;
}
我收到此错误。
错误C2614:'A':非法成员初始化:'A'不是基础或成员
关于SO也有类似的问题,但它们与继承有关。有人可以解释原因以及标准对此有何看法?
修改
如果有人在C ++ 11中详细说明转发构造函数和此功能,那会更好。
答案 0 :(得分:5)
如果您可以使用C ++ 11,则可以从A()
初始化A(int, int)
。这在C ++ 03中是不可能的,你必须编写两个独立的构造函数。
如果您希望您的代码在C ++ 03中工作,您有两个选择:
init(int, int)
并从每个构造函数中调用它。如果你的构造函数做了很多工作,这是一个很好的选择。您还可以从子类构造函数中调用基础构造函数。例如,如果你有
class A {
A(int, int);
};
class B : public A {
B(int, int);
};
你可以写
B::B(int x, int y) : A(x,y) {}
这就是你的编译器在说出A is not a base
时的意思,它期待这种情况。
所有这些都与C ++ 03兼容。
您还可以升级编译器以支持C ++ 11功能。如果您在Linux中工作并且希望您的项目在Windows中编译,我不建议这样做,因为Windows编译器没有实现Linux编译器所做的所有C ++功能(除非您支付好的编译器)。
答案 1 :(得分:1)
这是因为您在以下构造函数中遇到问题:
从错误消息的外观来看,我假设您使用的是Visual Studio(可能是2010)并且我同意,它在VS2010中不起作用。
A:A(0,0){ }
修复VS 2010及其前身:A():a(0),b(0){}
答案 2 :(得分:0)
你不能这样做A() :A(0,0){};
这种方式用于初始化类库成员。
A(){a=0;b=0;};
或者如果您希望定义private: void set(int x, int y);
并在构造函数中使用它。
答案 3 :(得分:0)
您正在尝试使用委托构造函数,该构造函数是仅在C++11
中引入的语言功能,并且尚未在每个编译器中实现。
答案 4 :(得分:0)
A() :A(0,0){};
称为构造函数链接。
您应该检查编译器是否接受C ++ 11。构造函数链接仅在C ++ 11中有效。以前没有。
你使用什么编译器?