Странная ошибка с частичной и явной специализацией шаблона - PullRequest
0 голосов
/ 09 ноября 2011

Ниже приводится «Внутренняя ошибка компилятора» в MSVC ++ 10 Sp1.

И в gcc:

b.cpp: 16: 12: ошибка: явная специализация в области, не связанной с пространством имен'struct A :: B'

b.cpp: 16: 28: ошибка: идентификатор шаблона 'f' в объявлении основного шаблона

//class template
template< class T>
struct A{

    //struct B  {};  //Remove the comment and it will compile!
};

//partial specialization
template<  class T >
struct A< T* >
{
    struct B  {

        template<class C>   void f(){}

            //"Internal Compiler Error"
        template<>          void f<int>(){};

    };
};

Однако, если комментарии до struct B удалено, оно скомпилируется!

Я не понимаю проблемы!

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

В вашем коде есть ошибка, и MSVC ++ не справляется с ней.Компиляция gcc производит это:

$ make parspec.o
g++    -c -o parspec.o parspec.cc
parspec.cc:17: error: explicit specialization in non-namespace scope ‘struct A<T*>::B’
make: *** [parspec.o] Error 1

Короче говоря, вы не можете специализироваться внутри класса или структуры.

РЕДАКТИРОВАТЬ: Быстрый поиск Google предполагает, что MSVC ++допускает такие несоответствующие конструкции, но я думаю, что они не очень хорошо с этим справились.

0 голосов
/ 09 ноября 2011

Вы не можете специализировать функцию-член для нескольких экземпляров шаблона класса. Это разрешено:

template<typename T>
struct A{
};

template<typename T>
struct A<T*>
{
    struct B  {
        template<class C>   void f();
    };
};

template<typename T>
template<typename C>
void A<T*>::B::f() {}

template<>
template<>
void A<char*>::B::f<int>() {}

Но это не так:

template<typename T>
template<>
void A<T*>::B::f<int>() {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...