模板化类

时间:2016-02-03 00:22:54

标签: c++ c++11 templates template-specialization ambiguity

我写了以下惊天动地的应用程序:

class SomeA { }; class SomeB { }; class SomeC { };

template <typename A, typename B, typename... Cs>
class Foo {
public:
    template <typename U> static void bar();
};

template <typename U>
void Foo<SomeA, SomeB, SomeC>::bar() { };

int main() { return 0; }

当我编译它(带有-std=c++11的gcc 4.9.3)时,我收到以下错误:

a.cpp:10:36: error: ambiguating new declaration of ‘static void Foo<SomeA, SomeB, SomeC>::bar()’
 void Foo<SomeA, SomeB, SomeC>::bar() { };
                                    ^
a.cpp:6:36: note: old declaration ‘static void Foo<A, B, Cs>::bar() [with U = U; A = SomeA; B = SomeB; Cs = {SomeC}]’
  template <typename U> static void bar();
                                    ^

为什么这是一个“模棱两可的声明”,以及如何为所有U实现bar,但是对于Foo的特定实例?

使用clang 3.6.2,我收到错误:

a.cpp:9:1: error: template parameter list matching the non-templated nested type 'Foo<SomeA, SomeB, SomeC>' should be empty ('template<>')
template <typename U>
^        ~~~~~~~~~~~~

我也没有真正得到这个。如果clang想要一个空的参数列表,我该如何模仿U?

1 个答案:

答案 0 :(得分:4)

不知道歧义新声明意味着什么,但您要专门化封闭类模板Foo,因此您需要使用空模板参数列表

template <>
template <typename U>
void Foo<SomeA, SomeB, SomeC>::bar() { }

Live demo