Проблема инициализации статических шаблонов С++
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;
}
В этом случае у нас не будет выхода в stdout. Компилятор не будет генерировать код для инициализации float и двойной специализации класса A.
Но.. если мы будем менять инициализации следующим образом:
template<> B<float> A<float>::static_var = B<float>();
template<> B<double> A<double>::static_var = B<double>();
компилятор сгенерирует такой код, и у нас будет двойной "B()" на выходе.
Может кто-нибудь помочь мне с пониманием такого поведения?
Ответы
Ответ 1
n3337 14.7.3/13
Явная специализация статического члена данных шаблона - это определение, если объявление содержит
инициализатор; в противном случае это объявление. [Примечание. Определение статического элемента данных шаблона, который
требует инициализации по умолчанию, должен использовать список с привязкой к завершению:
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 = ...;