2013-02-11 48 views
5

Tôi có một vấn đề với một đoạn mã có dạng như sau:Gọi đến chức năng template thành viên không biên dịch

template<class Type> 
class Class1 { 
public: 
    template<class TypeName1> TypeName1* method1() const {return 0;} 
}; 

struct Type1{}; 
struct Type2{}; 

class Class2 { 
public: 
    template<typename TypeName1, typename TypeName2> 
    int method2() { 
     Class1<TypeName2> c; 
     c.method1<TypeName1>(); 
     return 0; 
    } 

    int method1() { 
     return method2<Type1, Type2>(); 
    } 
}; 

int 
main() { 
    Class2 c; 
    return c.method1(); 
} 

Khi biên dịch với trình biên dịch tại codepad:

http://codepad.org/ZR1Std4k

tôi nhận được lỗi sau:

t.cpp: In member function 'int Class2::method2()': Line 15: error: expected primary-expression before '>' token compilation terminated due to -Wfatal-errors.

Dòng vi phạm là yêu cầu chức năng template thành viên:

c.method1<TypeName1>(); 

Trả lời

11

Bạn nên sử dụng template từ khóa khi bạn đang gọi một hàm thành viên template và bạn có một tên phụ thuộc, hoặc method1 sẽ được phân tích như là một biến thành viên của c< như là một "ít hơn là" biểu tượng:

c.template method1<TypeName1>(); 

Như @DrewDormann một cách chính xác chỉ ra, lý do tại sao từ khóa template được yêu cầu là một chuyên môn hóa của mẫu Class1 lớp có thể tồn tại cho đối số loại đặc biệt được cung cấp, nơi 0.123.được định nghĩa là biến thành viên thay vì mẫu chức năng. Do đó, trình biên dịch phải được hướng dẫn rõ ràng để phân tích cú pháp method1 làm tên của mẫu chức năng nếu không phải như vậy.

+0

Câu trả lời hay. Ngôn ngữ khủng khiếp. –

+0

Làm việc như một say mê, sẽ chấp nhận trong 5 phút! –

+2

+1. Cụ thể trong bối cảnh này, mặc dù 'Class1' được chuyển tiếp khai báo, nó không thể được giả định rằng' Class1 :: method1' là một hàm mẫu. Một chuyên môn mẫu của 'Class1' ở nơi khác có thể chứng minh khác. –

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