在'...'标记之前预期的primary-expression调用模板化类的模板化方法

时间:2017-09-27 08:32:58

标签: c++ c++11 templates

我在模板化的类中有一个模板化的静态方法,我从模板化的函数中调用它。编译失败,错误为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>)之间的差异特别令人困惑。

1 个答案:

答案 0 :(得分:5)

应该是

Run<T>::template run<Args...>(args...);

Run<int>是非依赖模板,而Run<T>是。

顺便说一下,在你的例子中,你甚至不需要指定参数,只需要进行演绎:

Run<int>::run(args...);
Run<T>::run(args...);