2012-09-24 28 views
19

Điều gì sai với đoạn mã sau đây?Mẫu ứng cử viên bị bỏ qua vì đối số mẫu không thể suy ra được

#include <iostream> 

template<typename K> 
struct A { 
    struct X { K p; }; 
    struct Y { K q; }; 
}; 

template<typename K> 
void foo(const typename A<K>::X& x, const typename A<K>::Y& y) { 
    std::cout << "A" << std::endl; 
} 

int main() { 
    A<float>::X x; 
    A<float>::Y y; 
    foo(x, y); 
} 

kêu vang cung cấp cho các thông báo lỗi sau:

17:2: error: no matching function for call to 'foo' 
     foo(x, y);  
     ^~~ 
10:6: note: candidate template ignored: couldn't infer template argument 'K' 
void foo(const typename A<K>::X& x, const typename A<K>::Y& y) { 
    ^
1 error generated. 

Trả lời

37

Đối số K trong const typename A<K>::Xkhông deducible. Về cơ bản, mọi thứ còn lại của :: không được khấu trừ (nếu :: tách biệt tên lồng nhau).

Đó là tầm thường để xem tại sao nó làm cho không có ý nghĩa để xin khấu trừ bằng cách chạy qua thí nghiệm này nghĩ:

struct A { typedef int type; } 
struct B { typedef int type; } 

template <typename T> void foo(typename T::type); 

foo(5); // is T == A or T == B ?? 

Không có one-to-one ánh xạ từ các loại với các loại lồng nhau: Với bất kỳ loại (ví dụ như int), có thể có nhiều loại môi trường xung quanh mà nó là kiểu lồng nhau hoặc không cần bất kỳ loại nào.

6
template<typename K> 
void foo(const typename A<K>::X& x, const typename A<K>::Y& y) { 
    std::cout << "A" << std::endl; 
} 

K không thể được suy luận vì nó ở trong ngữ cảnh non-deduced.

n3337 14.8.2.5/4

Trong bối cảnh nhất định, tuy nhiên, giá trị không tham gia vào loại trừ, nhưng thay vì sử dụng các giá trị của đối số mẫu mà hoặc là suy luận ở nơi khác hoặc một cách rõ ràng cụ thể. Nếu thông số mẫu chỉ được sử dụng trong các ngữ cảnh không được suy luận và không được chỉ định rõ ràng, thì khấu trừ đối số mẫu không thành công.

n3337 14.8.2.5/5

Các bối cảnh phi suy luận là:

- Các lồng nhau-tên-specifier của một loại mà đã được chỉ định sử dụng một trình độ-id.

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