3

次のコードを検討してください。

struct Test {
    template <int S>
    bool call();
};

template <>
bool Test::call<0>() {
    return false;
}

template <>
bool Test::call<1>() {
    return true;
}

template <int S, typename T>
static void func(T& t) {
    t.call<S>();
}

int main()
{
    Test t;
    func<0>(t);
}

コンパイルエラーが発生しました:

a.cpp: In function ‘void func(T&)’:
a.cpp:19:15: error: expected primary-expression before ‘)’ token
a.cpp: In instantiation of ‘void func(T&) [with int S = 0; T = Test]’:
a.cpp:25:14:   required from here
a.cpp:19:5: error: invalid operands of types ‘&lt;unresolved overloaded function type>’ and ‘int’ to binary ‘operator<’

t.call<0>()またはt.call<1>()main()関数に入れると、正常に動作します。このコードでテンプレート引数の推定が機能しない理由を誰か教えてもらえますか? この場合、部分的に特殊化されたテンプレート メンバー関数を使用して型を渡すことが機能しない理由がわかりません。

4

3 に答える 3

3

あなたが言う必要があります

template <int S, typename T>
static void func(T& t) {
    t.template call<S>();
}

T依存型名であるため、コンパイラはそれcall()がテンプレート関数であることを認識しないため、明確にする必要があります。

于 2013-11-04T10:04:50.223 に答える
1

templateキーワードを使用して解析を明確にする必要があります。

template <int S, typename T>
static void func(T& t)
{
    t.template call<S>();
}
于 2013-11-04T10:03:50.377 に答える