1

次のように「オーバーロード」したいテンプレート構造があります。

#include <iostream>

template <typename T, typename U = int>
struct foo {
    void operator()(T, U);
}

template <typename T, typename U = int>
void foo::operator()(T a, U b){
    std::cout << "T, U ()\n";
}

template <typename T>
struct foo<T, int> {
    void operator()(T);
}

template <typename T>
void foo<T, int>::operator()(T a){
    std::cout << "T ()\n";
}

int main(int argc, char **argv){
    foo<int> a;
    foo<int, char> b;

    a(1);
    b(2, 'b');

    return false;
}

しかし、コンパイルすると、次のエラーが発生します。

($ g++ test.cpp -o test)
test.cpp:11:6: error: 'template<class T, class U> struct foo' used without template parameters
test.cpp:11:30: error: 'void operator()(T, U)' must be a nonstatic member function

foo< T, int >::operator() の定義が完全に機能しているように見えるため、これは奇妙です。また、関数をインラインで次のように定義すると、次のようになります。

template <typename T, typename U = int>
struct foo {
    void operator()(T a, U b){ std::cout << "T, U ()\n"; }
}

問題なく動作します。

4

2 に答える 2

2

これらのテンプレート パラメーターを使用して、どの foo を指定する必要がありますfoo<T,U>::operator()。そして、デフォルトのテンプレート パラメータ値を定義から削除します。

template <typename T, typename U>    // don't use a default parameter
void foo<T,U>::operator()(T a, U b){ // don't forget the <T,U> here
    std::cout << "T, U ()\n";
}

テンプレート クラス定義の後のセミコロンも忘れています。

于 2012-11-02T19:11:50.630 に答える
0

関数プロトタイプでデフォルトのテンプレート パラメータを 1 回だけ指定できます (その関数にプロトタイプがある場合)。

template <typename T, typename U = int> void f();
// ....

template <typename T, typename U = int> void f() {}

それは必要ありません。単にそれを作る:

template <typename T, typename U> void f() {}
于 2012-11-02T19:05:08.137 に答える