2012-10-01 41 views
23

thể trùng lặp:
C++ template member function of template class called from template functionCách gọi hàm thành viên mẫu?

template<class T1> 
class A 
{ 
public: 
    template<class T0> 
    void foo() const {} 
}; 

template<class T0,class T1> 
void bar(const A<T1>& b) 
{ 
    b.foo<T0>(); // This throws " expected primary-expression before ‘>’ token" 
} 

tôi có thể thay đổi nó để

b->A<T1>::template foo<T0>(); 

mà biên dịch tốt. Tuy nhiên, tôi cũng có thể thay đổi nó thành

b.A<T1>::template foo<T0>(); 

cũng biên dịch cũng được. eh?

Làm cách nào để chính xác gọi hàm thành viên mẫu theo ý nghĩa của mã gốc?

+0

Chúng ta biết những gì hai câu mà thực sự biên dịch nghĩa là gì? Trong ví dụ "nấu chín" này, chúng biên dịch, nhưng trong chương trình thực sự của tôi, nó không biên dịch. – ritter

Trả lời

37

Chỉ cần tìm thấy nó:

Theo C++ '03 Chuẩn 14,2/4:

Khi tên của một thành viên mẫu chuyên môn xuất hiện sau khi . hoặc -> trong một postfix thể hiện, hoặc sau nested-name-specifier trong một id đủ điều kiện và biểu thức postfix hoặc id đủ điều kiện rõ ràng phụ thuộc vào tham số mẫu (14.6.2), tên mẫu thành viên phải được bắt đầu bằng từ khóa template. Nếu không, tên được giả định là đặt tên cho một mẫu không phải là mẫu.

mã đúng là:

b.template foo<T0>(); 
+1

Và điều này được thực hiện cho cùng một lý do và trong các điều kiện tương tự như khi 'typename' là cần thiết. – bames53

10

bạn có thể gọi hàm theo cách này:

b.template foo<T0>(); 
Các vấn đề liên quan