我在模板化的类中有一个模板化的静态方法,我从模板化的函数中调用它。编译失败,错误为error: expected primary-expression before '...' token
。
这是一个示例代码。它有一些未使用的模板参数,但与我的实际代码完全相同,这些参数很重要。
temp late<typename T>
class Run {
public:
template<typename ...Args>
static void run(Args... args) {}
};
template <typename T, typename ...Args>
void
run2(Args ...args)
{
Run<int>::run<Args...>(args...); // OK
Run<T>::run<Args...>(args...); // Fail on first . in Args...
}
int main() {
run2<int>(1, 2, 3);
return 0;
}
编译错误:
% g++ -std=gnu++11 -o try try.cc
try.cc: In function 'void run2(Args ...)':
try.cc:13:21: error: expected primary-expression before '...' token
Run<T>::run<Args...>(args...); // Fail on first . in Args...
^
try.cc:13:21: error: expected ';' before '...' token
在Ubuntu上使用gcc 4.8.5。同样使用gcc 6.3
进行复制知道发生了什么事吗?工作线(带<int
&gt;)和失败线(带<T>
)之间的差异特别令人困惑。
答案 0 :(得分:5)
应该是
Run<T>::template run<Args...>(args...);
Run<int>
是非依赖模板,而Run<T>
是。
顺便说一下,在你的例子中,你甚至不需要指定参数,只需要进行演绎:
Run<int>::run(args...);
Run<T>::run(args...);