Существует много информации о том, когда называются конструкторы статических членов обычных классов.Тем не менее, я вижу странное поведение в отношении классов шаблонов.
Каким должен быть вывод следующей программы?(Заметьте, я использую 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 не считается экземпляром шаблона Atempl и не вызывает конструктор B?Это часть стандарта или ошибка в g ++ 4.3?