2010-06-16 38 views

Trả lời

16

Khi một phụ thuộc tên được sử dụng để chỉ một mẫu lồng nhau, tên lồng nhau phải được thêm vào phía trước với từ khóa template để giúp trình biên dịch hiểu rằng bạn đang đề cập đến một mẫu lồng nhau và phân tích mã một cách chính xác

template <typename T> 
void F(A<T> &a) 
{ 
    a.template f<0>(); 
} 

Bên trong main tên a không phụ thuộc, đó là lý do tại sao bạn không cần thêm từ khóa template. Bên trong F tên a phụ thuộc, đó là lý do tại sao từ khóa là cần thiết.

Điều này tương tự với từ khóa thêm typename khi đề cập đến tên loại lồng nhau thông qua tên phụ thuộc. Chỉ cú pháp hơi khác một chút.

1

Trong cựu, trình biên dịch nghĩ rằng bạn có nghĩa là ...

a.f < 0 ...gibberish.... 

Andrey của câu trả lời sửa lỗi đó.

0

Chú ý rằng có đoạn mã có giá trị cả từ khóa bổ sung và không thêm, mang lại kết quả khác nhau trong từng trường hợp, ngay cả đối với các mẫu mà lấy thông số loại thay vì số nguyên.

#include <iostream> 

struct A { 
    template<typename T> 
    static A f(T) { 
    return A(); 
    } 

    template<typename T> operator T() { return T(); } 
}; 

template<typename U> 
int g() { 
    U u; 
    typedef A (*funcPtrType)(int()); 
    return !(funcPtrType)u.f < int() > (0); 
} 

int main() { 
    std::cout << g<A>() << std::endl; 
} 

này kết quả đầu ra 0 khi chạy mà không có từ khóa template thêm. Nếu bạn thêm từ khóa trước f < int() >, từ khóa sẽ xuất ra 1.


Giải thích

Phiên bản mà không có từ khóa phân tích như

funcPtrType temp1 = (funcPtrType)u.f; // taking func address 
bool temp2 = !temp1;     // temp2 == false 
bool temp3 = temp2 < int();   // temp3 == false 
bool temp4 = temp3 > (0);    // temp4 == false 
return temp4; 

Và phiên bản với từ khóa phân tích như

A temp1 = u.template f < int() > (0);  // function call 
funcPtrType temp2 = (funcPtrType) temp1; // temp2 == 0 
bool temp3 = !temp2;      // temp3 == true 
return temp3; 

ý rằng temp2 là một con trỏ null (được sản xuất bởi return T()). Toàn bộ các phân tích cú pháp khác nhau và cả hai đều hợp lệ! Điều này thực sự cần một cách để phân biệt - đó là chèn từ khóa template nếu thích hợp.

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