2016-02-03 8 views
0

я написал следующее поразительное заявление:«ambiguating новой декларации» ошибка для шаблонного метода в шаблонном классе

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; } 

Когда я компилирую это (GCC 4.9.3 с -std=c++11), я получаю следующее сообщение об ошибке:

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(); 
            ^

Почему это «ambiguating декларация», и как еще можно реализовать планку для всех U с, но для конкретного экземпляра Foo?

С лязгом 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> 
^  ~~~~~~~~~~~~ 

Я не получить это либо. Как я могу использовать шаблон для U, если clang хочет получить пустой список параметров?

+0

Я надеваю «Не знаю, что такое« неоднозначная новая декларация », но Clang дает гораздо более полезное сообщение об ошибке: http://coliru.stacked-crooked.com/a/308fd608ff25e9a3 – Brian

ответ

3

Понятия не имеет, что ambiguating новых декларации средств, но вы Специализируя шаблон класса вшит Foo, так что вам нужно, чтобы указать, что со списком параметров пустого шаблона

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

Live demo

+0

Ох ... ах ... Я вижу. Я не знал, что вы можете следовать шаблону 'немедленно с другим' template '. – einpoklum

 Смежные вопросы

  • Нет связанных вопросов^_^