Я использую этот довольно простой класс без какого-либо наследования.
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.
Если вы можете использовать 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 не реализуют все функции C ++, которые делают компиляторы Linux (если вы не платите за хороший компилятор).
это из-за вашей проблемы с конструктором в:
Судя по вашему сообщению об ошибке, я предполагаю, что вы работаете в Visual Studio (вероятно, 2010), и я согласен, это не работает в VS2010.
A:A(0,0){ }
Фикс для VS 2010 и его предшественников: A():a(0),b(0){}
Вы не можете сделать это так A() :A(0,0){};
этот способ используется для инициализации базовых членов класса.
A(){a=0;b=0;};
или если вы хотите определить private: void set(int x, int y);
и использовать его в конструкторах.
A() :A(0,0){};
называется конструктор цепочки.
Вы должны проверить, что ваш компилятор принимает C ++ 11. Цепочка конструктора действительна только в C ++ 11. Это не было доступно раньше.
Какой компилятор вы используете?
Вы пытаетесь использовать делегирующий конструктор, который является языковой функцией, которая была представлена только в C++11
и который еще не реализован в каждом компиляторе.