7

tôi có một lỗi trong mã dưới đây:lớp thành viên dữ liệu mẫu nhà nước, không phải là một thực thể mà có thể chuyên một cách rõ ràng

template<typename T, bool B = is_fundamental<T>::value> 
class class_name; 

template<> 
class class_name<string, false>{ 
public: 
    static string const value; 
}; 

template<> 
string const class_name<string, false>::value = "Str"; 
// error: not an entity that can be explicitly specialized.(in VC++) 

Làm thế nào tôi có thể sửa chữa nó?

+6

Bỏ 'cái template <> 'trong định nghĩa 'giá trị'. –

+0

@KerrekSB Cảm ơn bạn rất nhiều ! –

+0

@KerrekSB Câu trả lời như thế này thường không bao giờ trở thành "trả lời"? Tôi đang cố gắng tìm hiểu những gì chúng ta nên/không nên làm khi chúng ta trả lời một cái gì đó trong một bình luận. – JaredC

Trả lời

5

Bạn đang trộn hai phương pháp khác nhau tại đây. Đầu tiên là một trong những đề xuất bởi @KerrekSB

template<typename T, bool B = is_fundamental<T>::value> 
class class_name; 

// NOTE: template<> is needed here because this is an explicit specialization of a class template 
template<> 
class class_name<string, false>{ 
public: 
    static string const value; 
}; 

// NOTE: no template<> here, because this is just a definition of an ordinary class member 
// (i.e. of the class class_name<string, false>) 
string const class_name<string, false>::value = "Str"; 

Ngoài ra, bạn có thể hoàn toàn viết ra các lớp mẫu nói chung và chuyên một cách rõ ràng các thành viên tĩnh cho <string, false>

template<typename T, bool B = is_fundamental<T>::value> 
class class_name { 
public: 
    static string const value; 
}; 

// NOTE: template<> is needed here because this is an explicit specialization of a class template member 
template<> 
string const class_name<string, false>::value = "Str"; 
+0

Được thăng hạng. Ngoài ra, trong cả hai trường hợp, các định nghĩa cần phải có trong tệp CPP và cho trường hợp chuyên môn của thành viên, bạn cần khai báo chuyên môn trong tiêu đề. –

+0

@ JohannesSchaub-litb Có, điểm tốt, tôi không quá quan tâm đến điều đó vì áp phích không có 'chính()', v.v. – TemplateRex