2015-05-22 3 views
3

Существует класс шаблона в пространстве именшаблона специализации статический член в другом пространстве имен

namespace N 
{ 
    template <typename T> 
    class Foo { 
     static const T bar; 
    }; 
} 

И специализация в другом пространстве имен:

namespace O 
{ 
    typedef N::Foo<int> Baz; 

    template<> 
    const int Baz::bar = 1; 
} 

Этот код компилируется с GCC (4.9.2) но не скомпилируется с помощью msvc (v120):

error C2888: 'const int N::Foo<int>::bar' : symbol cannot be defined within namespace 'O' 

Если я это правильно понимаю, код не является C++ 11:

An explicit specialization shall be declared in a namespace enclosing the specialized template. An explicit specialization whose declarator-id is not qualified shall be declared in the nearest enclosing namespace of the template, or, if the namespace is inline (7.3.1), any namespace from its enclosing namespace set.

Является ли это ошибкой компилятора или я неправильно понимаю?

ответ

7

Это ошибка компилятора и still present in HEAD. Сообщите об этом. Кланг обеспечивает более четкую диагностику:

error: cannot define or redeclare 'bar' here because namespace 'O' does not enclose namespace 'Foo'

const int Baz::bar = 1; 
      ~~~~~^ 
+0

Blah, 40 секунд :) – Barry

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