35

次のコードの何が問題になっていますか?

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

clang により、次のエラー メッセージが表示されます。

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.
4

3 に答える 3

53

の引数Kは演繹できconst typename A<K>::Xませ。基本的に、 a の残りはすべて::推定できません (::ネストされた名前を分離する場合)。

この思考実験を実行して、演繹を求めることが無意味である理由を理解するのは簡単です。

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

型からネストされた型への 1 対 1 のマッピングはありません。任意の型 ( などint) を指定すると、ネストされた型である多くのアンビエント型が存在する可能性があります。

于 2012-09-24T13:39:48.757 に答える
9
template<typename K>
void foo(const typename A<K>::X& x, const typename A<K>::Y& y) {
    std::cout << "A" << std::endl;
}

Knon-deduced文脈にあるので推測できません。

n3337 14.8.2.5/4

ただし、特定のコンテキストでは、値は型推定に参加せず、代わりに別の場所で推定された、または明示的に指定されたテンプレート引数の値を使用します。テンプレート パラメーターが推定されないコンテキストでのみ使用され、明示的に指定されていない場合、テンプレート引数推定は失敗します

n3337 14.8.2.5/5

非推定コンテキストは次のとおりです。

— 修飾 ID を使用して指定されたタイプのネストされた名前指定子。

于 2012-09-24T13:40:00.393 に答える