我试图弄清楚为什么这个例子不能编译。我的理解是,如果未明确设置静态变量,则默认为 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;
}
为什么不做与orint Bar<2>::i
相同的事情?int Foo::i
static int i
编辑:我忘记将 template<> 添加到 Bar<2> 和 Bar<3> 声明中。(虽然没有解决问题,仍然出现链接器错误)