1

私はこのようなことをしようとしています:

#include <iostream>
#include <array>
using namespace std;

template <size_t A>
class Test {
    public:
        typedef array<int, A> TestType;
};

template <size_t A>
void foo(Test<A>::TestType t) {
    cout << "test\n";
}

int main() {
    Test<5>::TestType q;

    foo(q);
    return 0;
}

しかし foo はコンパイルされません。gccで私は得る

prog.cpp:12:19: error: variable or field ‘foo’ declared void
 void foo(Test<A>::TestType t) {
                   ^
prog.cpp:12:28: error: expected ‘)’ before ‘t’
 void foo(Test<A>::TestType t) {

Visual Studio 2010 では、

error C2975: 'Test' : invalid template argument for 'A', expected compile-time constant expression

A はコンパイル時の定数であるため、何が間違っているのかわかりません。何を変更すればよいですか?

4

1 に答える 1

1

次のように追加する場合typename

template <size_t A>
void foo(typename Test<A>::TestType t) {
    cout << "test\n";
}

唯一の効果は、より良いエラー メッセージです。問題は、そのようなテンプレート パラメーターをまだ推測できないことです。

宣言するとq

Test<5>::TestType q;

qの型はstd::array<int,5>であり、コンパイラはこの型が にどのように接続されているかを知りませんTest<5>。itの呼び出しfoo(q)では、標準化されていないコードをさらに深く分析して、 に一致する可能性のあるものが 1 つしかないことを確認する必要がありAます。電話する必要があります

foo<5>(q);

明示的に指定するか、 の定義を変更しますfoo

template <size_t A>
void foo(std::array<int,A> t) {
    cout << "test\n";
}
于 2013-10-29T19:20:44.023 に答える