Tôi đang cố gắng tìm ra lý do tại sao ví dụ này không biên dịch. Sự hiểu biết của tôi là nếu một biến tĩnh không được thiết lập rõ ràng thì nó mặc định là 0. Trong năm ví dụ dưới đây, bốn ví dụ này hoạt động như tôi mong đợi, nhưng một biến được nhận xét sẽ không biên dịch.Khởi tạo các thành viên tĩnh của một lớp templated
#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;
}
Tại sao không int Bar<2>::i
làm điều tương tự như int Foo::i
hoặc static int i
?
Chỉnh sửa: Tôi đã quên thêm mẫu <> vào thanh < 2> và thanh < 3> khai báo. (Không giải quyết được vấn đề, mặc dù vẫn nhận được mối liên kết lỗi)
Bản sao của [khởi tạo thành viên tĩnh cho lớp mẫu chuyên biệt] (http://stackoverflow.com/questions/2342550/static-member-initialization-for-specialized-template-class). –
Lỗi liên kết là gì? – Chubsdad
@Chubsdad: Chắc chắn đó là "Tham chiếu không xác định đối với' Thanh <2> :: i' "hoặc điều gì đó có nghĩa là. Trong mã của OP, 'template <> int Bar <2> :: i;' là một khai báo _nondefining_ (xem bản sao được liên kết cho lời giải thích chi tiết của litb). –