Не мог бы кто-нибудь помочь мне понять, почему следующий код не компилируется (g ++ 4.8). Я понимаю, что можно было бы инициализировать PODstd :: is_pod vs subclassing
#include <iostream>
#include <type_traits>
struct my_int
{
int val_;
};
struct B : public my_int
{
};
int main()
{
std::cout << std::is_pod<my_int>::value << std::endl;
std::cout << std::is_pod<B>::value << std::endl;
const my_int v = { 123 };
//const B v2 = { 123 }; // does not compile with g++ 4.8.
return 0;
}
компиляции:
g++ -std=c++11 t.cxx
t.cxx: In function 'int main()':
t.cxx:24:21: error: could not convert '{123}' from '<brace-enclosed initializer list>' to 'const B'
const B v = { 123 };
^
EDIT:
Спасибо всем ответить теперь я понимаю понятие совокупной инициализации. Я пропустил тот факт, что совокупность не может иметь базовый класс. Поэтому мои текущие планы реализации необходимо изменить. Я хотел сделать что-то вроде:
template < typename T >
struct base_class
{
int val_;
};
struct MyInt : public base_class<int>
{
void Func1() {}
};
struct MyDouble : public base_class<double>
{
void Func2() {}
};
Я переделок код выше, чтобы избежать использования подкласса вводить специальные функции-члены, избежать дублирования кода.
Вы могли бы добавьте нетривиальный ** не по умолчанию ** ctor, например 'B :: B (int p): my_int (p) {}', который сохраняет статус «B» как POD, но допускает инициализацию 'const B v2 = {123}; '. – dyp