2012-09-24 11 views
19

Co jest nie tak z następującym kodem?Szablon kandydata został zignorowany, ponieważ nie można wywnioskować argumentu szablonu

#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); 
} 

dzyń daje następujący komunikat o błędzie:

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. 

Odpowiedz

37

Argument K w const typename A<K>::X jest nie wywnioskować. Zasadniczo wszystko, co pozostało z ::, nie jest dedukowalne (jeśli :: oddziela nazwę zagnieżdżoną).

To banalne, dlaczego nie ma sensu prosić o potrąceniu przez uruchomiony przez tego myślowego eksperymentu:

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 ?? 

nie ma odwzorowanie jeden do jednego z typów do zagnieżdżonych typów: podany dowolnego typu (np jako int), może istnieć wiele typów otoczenia, z których jest to typ zagnieżdżony, lub nie ma ich wcale.

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

K nie można było wywnioskować, ponieważ jest to w non-deduced kontekście.

n3337 14.8.2.5/4

W pewnych sytuacjach jednak wartość nie uczestniczy w rodzaju odliczenia, ale zamiast tego używa wartości argumentów szablonów albo zostały wyprowadzone gdzie indziej albo wyraźnie określone. Jeśli parametr szablonu jest używany tylko w nie wydedukowanych kontekstach i nie jest jawnie określony, odliczanie argumentów szablonu nie powiedzie się.

n3337 14.8.2.5/5

niepoddanej wywnioskować konteksty są:

- zagnieżdżona nazwa-specyfikator typu, który został określony za pomocą kwalifikowanej ID.

Powiązane problemy