Инициализация статических членов шаблонного класса

Я пытаюсь понять, почему этот пример не компилируется. Насколько я понимаю, если статическая переменная не установлена ​​явно, то по умолчанию она равна 0. В приведенных ниже пяти примерах четыре из них ведут себя так, как я ожидал, но та, что закомментирована, не компилируется.

#include <iostream>
class Foo
{
public:
    static int i;
    static int j;
};
template <int n>
class Bar
{
public:
    Bar(int) { }
    static int i;
}; 

static int i;
int Foo::i;
int Foo::j = 1;
template <> int Bar<2>::i;
template <> int Bar<3>::i = 3;

int main(int argc, char** argv)
{
    std::cout << "i         " << i << std::endl;
    std::cout << "Foo::i    " << Foo::i << std::endl;
    std::cout << "Foo::j    " << Foo::j << std::endl;
    //std::cout << "Bar<2>::i " << Bar<2>::i << std::endl; // Doesn't compile?
    std::cout << "Bar<3>::i " << Bar<3>::i << std::endl;
    return 0;
}

Почему int Bar <2> :: i не выполняет то же действие, что и int Foo :: i или static int i ?

Изменить: я забыл добавить шаблон <> в объявления Bar <2> и Bar <3>. (не решает проблему, по-прежнему возникают ошибки компоновщика)

6
задан Alex 8 September 2010 в 05:15
поделиться