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>。在调用foo(q)它时,需要对未标准化的代码进行更深入的分析,以找出只有一个可能的匹配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 回答