2012-03-14 31 views
6
struct Messages 
{ 
     template <typename V> 
     static const char* message() {return "test mesage";} 
}; 

template <int Min, class M=Messages> 
struct Test: public M 
{ 
    Test() 
    { 
     M::message<int>(); //error: expected primary-expression before 'int' 
    } 
}; 

int main() 
{ 
    Test<5, Messages> t; 
} 

Tôi nghi ngờ điều này đã làm với một số phụ thuộc lẫn nhau, giống như mã của thử nghiệm phụ thuộc vào M lớp cơ sở có phương pháp chuyên bên trong Kiểm tra. Điều này có đúng không?Tại sao tôi không thể gọi một phương thức templated của một lớp mẫu mà có nguồn gốc từ

Trả lời

7

M::message là tên phụ thuộc kể từ M là đối số mẫu. Trình biên dịch không thể biết rằng một tên phụ thuộc là thân mẫu, do đó bạn cần phải xác định này một cách rõ ràng:

M::template message<int>(); 

Nếu trình biên dịch phân tích các mã như dù M::message là một giá trị, mang đến cho sau góc ngoặc một ý nghĩa khác nhau (tức là chúng được phân tách thành các toán tử nhỏ hơn và lớn hơn và không phải là các dấu phân tách danh sách mẫu). Trình biên dịch không thể phục hồi từ một phân tích sai như vậy.

+0

Cảm ơn, đúng vậy. Tôi không biết việc sử dụng từ khóa 'mẫu' này để phân biệt các tên phụ thuộc. –

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