Существует много информации о том, когда вызываются конструкторы статических членов обычных классов. Однако я наблюдаю странное поведение в отношении классов шаблонов.
Каким должен быть результат следующей программы? (Заметьте, я использую printf, чтобы избежать каких-либо осложнений, связанных с фиаско статической инициализации с std :: cout.)
#include <iostream>
class B {
public:
B(const std::string &s) { printf("Hello I am B from %s\n", s.c_str()); }
};
template<typename T>
class Atempl {
public:
static B b_;
};
class A {
public:
static B b_;
};
template<typename T>
B Atempl<T>::b_("Atempl");
B A::b_("A");
class C : public Atempl<int> {
};
int main(int argc, const char *argv[]) {
return 0;
}
Я думаю, что результат должен быть:
Hello I am B from A
Hello I am B from Atempl
Но с g ++ 4.3 на FreeBSD 7.3 я получаю:
Hello I am B from A
Если я добавлю строка
template class Atempl<int>;
все хорошо, и я получаю ожидаемый результат. Вопрос в том, почему объявление класса C не считается экземпляром шаблона. Атемпл и вызвать конструктор B? Это часть стандарта или ошибка в g ++ 4.3?