函数模板参数编译错误

时间:2013-10-29 19:13:18

标签: c++ visual-studio-2010 c++11

我正在尝试做这样的事情:

#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是编译时常量。我应该改变什么?

1 个答案:

答案 0 :(得分: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";
}