2016-09-08 18 views
6

Một lớp có thể chứa một biến thành viên mẫu mà phải tĩnh:viên mẫu biến chuyên

class B 
{ 
    public: 
     template <typename X> 
      static X var; 

     B() { std::cout << "Create B " << __PRETTY_FUNCTION__ << std::endl; } 

     template <typename T> 
     void Print() { std::cout << "Value is " << var<T> << std::endl; } 
}; 

Nó thành viên như tất cả các tĩnh phải được khai báo bên ngoài phạm vi lớp:

Các biên dịch sau và hoạt động như dự kiến:

template<typename T> T B::var=9; // makes only sense for int,float,double... 

Nhưng làm thế nào để chuyên var như mã không hoạt động sau (thông báo lỗi với gcc 6.1):

template <> double B::var<double>=1.123; 

Không với:

main.cpp:49:23: error: parse error in template argument list 
template <> double B::var<double>= 1.123; 
         ^~~~~~~~~~~~~~~~~~ 
main.cpp:49:23: error: template argument 1 is invalid 
main.cpp:49:23: error: template-id 'var<<expression error> >' for 'B::var' does not match any template declaration 
main.cpp:38:22: note: candidate is: template<class X> T B::var<T> 
      static X var; 

template <> double B::var=1.123; 

Không với

template <> double B::var=1.123; 
         ^~~ 
main.cpp:38:22: note: does not match member template declaration here 
      static X var; 

cú pháp chính xác ở đây là gì?

+1

Bạn có thể vui lòng bao gồm lỗi thực tế bạn nhận được ? – NathanOliver

+0

@NathanOliver: Xong;) – Klaus

+0

Những thứ đó ít hữu ích hơn. Tôi đã hy vọng sẽ có một cái gì đó trong đó để làm cho tiêu đề tìm kiếm nhiều hơn nhưng than ôi, trình biên dịch không giúp đỡ ở đây. – NathanOliver

Trả lời

7

Tôi cho rằng bạn nên thêm một không gian

template <> double B::var<double> = 1.123; 
           ^here 

Nếu không (nếu tôi không sai) >=1.123 được nhầm lẫn với "bình đẳng hoặc greather hơn 1,123"

+2

Đó là ... ngạc nhiên ngớ ngẩn (nguyên nhân, không phải là câu trả lời). – StoryTeller

+0

Tôi đã hiểu vấn đề ở đâu vì tôi đã thực hiện cùng một lỗi hai giờ trước: ( – max66

+1

Ví dụ về cách định dạng mã kém thực sự có thể dẫn đến lỗi. Ít nhất trong trường hợp này trình biên dịch đã bắt được lỗi đó. –

Các vấn đề liên quan