4

この単純なコードが機能しないのはなぜですか?

template<class U>
class retype 
{ 
    typedef U type; 
};

class object
{
public:
    template<class U>
    int create(typename retype<U>::type p)
    {
        return 4;
    }
};

int main()
{
    int n = object().create(5);

    return 0;
}

GCCでのコンパイル中にこのエラーが発生しました:

test.cpp: In function ‘int main()’:
test.cpp:20: error: no matching function for call to ‘object::create(int)’

問題はどこだ?

4

1 に答える 1

5

関数の引数からのテンプレート引数の推定に依存しています。しかし、関数テンプレートの引数は推定できません。これは推定不可能なコンテキストだからです。

より具体的には、テンプレート パラメーターは、Uであっても推定できませretype<U>::typeintretype次のように定義された特殊化がある可能性があるためです。

template<>
struct retype<X>
{
      typedef int type;
};

ご覧のとおり、 retype<U>::typeis が与えられintた場合、テンプレート パラメータUX同様です。

実際、そのような特殊化が複数存在する可能性があり、そのすべてが と定義typeされる場合がありますint。したがって、一対一の関係はありません。コンパイラは一意に を推測できませんU

于 2013-01-01T15:44:09.763 に答える