Проблема инициализации членов статического шаблона gcc — c ++

gcc 4.5.1, SuSE Linux i686

Предположим, у нас есть следующий код:

template<typename realT> class B
{
public:
B() {std::cout << "B()" << std::endl;}
};

template<typename realT> class A
{
public:
static B<realT> static_var;
};

template<typename realT> B<realT> A<realT>::static_var;
template<> B<float> A<float>::static_var;
template<> B<double> A<double>::static_var;

int main()
{
A<float> test;
return 0;
}

В этом случае у нас не будет никакого вывода в стандартный вывод. Компилятор не будет генерировать код для инициализации float и двойной специализации класса A.

Но .. если мы изменим инициализации, как это:

template<> B<float> A<float>::static_var = B<float>();
template<> B<double> A<double>::static_var = B<double>();

компилятор сгенерирует такой код, и мы будем иметь двойной «B ()» на выходе.

Может ли кто-нибудь помочь мне с пониманием такого поведения?

10

Решение

№ 3337 14.7.3 / 13


Явная специализация статического члена данных шаблона является определением, если объявление включает
инициализатор; в противном случае это декларация.
[Примечание: определение статического члена данных шаблона, который
требует инициализации по умолчанию, должен использовать braced-init-list:

template<> X Q<int>::x; // declaration
template<> X Q<int>::x (); // error: declares a function
template<> X Q<int>::x { };// definition

— конец примечания]

braced-init-list является C++11 особенность, так что в C++03 вы можете использовать только

template<> X Q<int>::x = ...;
8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]