Проблемы совместимости компилятора Microsoft с GCC и CLang
Пример кода
Код:
template <typename T>
class Parent
{
protected:
T val;
public:
Parent(): val(){}
Parent(T num): val(num){}
};
template <typename T>
class Child: public Parent<T>
{
protected:
T val1;
public:
Child(): Parent(), val1(){}
Child(T num): Parent(num), val1(num){}
};
int main()
{
auto xz = Child<int>(21);
return 0;
}
class Parent
{
protected:
T val;
public:
Parent(): val(){}
Parent(T num): val(num){}
};
template <typename T>
class Child: public Parent<T>
{
protected:
T val1;
public:
Child(): Parent(), val1(){}
Child(T num): Parent(num), val1(num){}
};
int main()
{
auto xz = Child<int>(21);
return 0;
}
Код:
g++ -std=c++11 test.cpp
test.cpp: In constructor ‘Child<T>::Child()’:
test.cpp:19:11: error: class ‘Child<T>’ does not have any field named ‘Parent’
Child():Parent(),val1(){}
^
test.cpp: In constructor ‘Child<T>::Child(T)’:
test.cpp:20:16: error: class ‘Child<T>’ does not have any field named ‘Parent’
Child(T num):Parent(num),val1(num){}
^
test.cpp: In constructor ‘Child<T>::Child()’:
test.cpp:19:11: error: class ‘Child<T>’ does not have any field named ‘Parent’
Child():Parent(),val1(){}
^
test.cpp: In constructor ‘Child<T>::Child(T)’:
test.cpp:20:16: error: class ‘Child<T>’ does not have any field named ‘Parent’
Child(T num):Parent(num),val1(num){}
^
Код:
clang -std=c++11 test.cpp
test.cpp:19:11: error: member initializer 'Parent' does not name a non-static
data member or base class
Child():Parent(),val1(){}
^~~~~~~~
test.cpp:20:16: error: member initializer 'Parent' does not name a non-static
data member or base class
Child(T num):Parent(num),val1(num){}
^~~~~~~~~~~
2 errors generated.
test.cpp:19:11: error: member initializer 'Parent' does not name a non-static
data member or base class
Child():Parent(),val1(){}
^~~~~~~~
test.cpp:20:16: error: member initializer 'Parent' does not name a non-static
data member or base class
Child(T num):Parent(num),val1(num){}
^~~~~~~~~~~
2 errors generated.
Код:
template <typename T>
class Child: public Parent<T>
{
protected:
T val1;
public:
Child(): Parent<T>(),val1(){} //<T>
Child(T num): Parent<T>(num), val1(num){} //<T>
};
class Child: public Parent<T>
{
protected:
T val1;
public:
Child(): Parent<T>(),val1(){} //<T>
Child(T num): Parent<T>(num), val1(num){} //<T>
};
PS: Читаем стандарт и пишем по нему же.
согласно стандарту C++11 в инициализаторе конструктора класса разрешается вызывать другие конструкторы того же класса включая вызовы базовых конструкторов при наследовании
Тут требуется уточнение. Передача параметров в конструктор базового класса из инициализации в конструкторе наследника -- не новое в С++. А вот возможность использования одного конструктора класса в другом его-же консрукторе -- новшество стандарта С++11. В общем-то ваш код к нововведениям C++11 отношения не имеет и будет работать со старыми компиляторами (когда исправите указанную ошибку, ну и без auto разумеется).
К 11-му стандарту имеет отношение подобное:
Код:
#include <iostream>
class SomeClass {
int x_;
public:
SomeClass(int x): x_(x) {}
SomeClass(): SomeClass(100) {}
void print(){std::cout << x_ << std::endl;}
};
int main() {
SomeClass sc;
sc.print(); //выдаст 100
return 0;
}
class SomeClass {
int x_;
public:
SomeClass(int x): x_(x) {}
SomeClass(): SomeClass(100) {}
void print(){std::cout << x_ << std::endl;}
};
int main() {
SomeClass sc;
sc.print(); //выдаст 100
return 0;
}