我正在尝试做这样的事情:
#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是编译时常量。我应该改变什么?
答案 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";
}