Pergunta

Parece-me que o C ++ não permite especialização de modelo membro em qualquer escopo diferente de namespace e alcance global (MS VSC ++ C3412 erro). Mas para mim faz sentido se especializar modelo de membro principal de uma classe base na classe derivada porque é isso que as classes derivadas fazer - coisas especializar-se na classe base. Por exemplo, considere o seguinte exemplo:

struct Base
{
  template <class T>
  struct Kind
  {
      typedef T type;
  };
};

struct Derived : public Base
{
  /* Not Allowed */
  using Base::Kind;
  template <>
  struct Kind <float> 
  {
    typedef double type;
  };
};

int main(void)
{
  Base::Kind<float>::type f;    // float type desired
  Derived::Kind<float>::type i; // double type desired but does not work.
}

A minha pergunta é por isso que não é permitido?

Foi útil?

Solução

Eu recebo o que você está tentando fazer, mas você não está fazendo certo. Tente isto:

struct Base{};
struct Derived{};

// Original definition of Kind
// Will yield an error if Kind is not used properly
template<typename WhatToDo, typename T>
struct Kind
{
};

// definition of Kind for Base selector
template<typename T>
struct Kind<Base, T>
{
  typedef T type;
};

// Here is the inheritance you wanted
template<typename T>
struct Kind<Derived, T> : Kind<Base, T>
{
};

// ... and the specialization for float
template<>
struct Kind<Derived, float>
{
  typedef double type;
};

Outras dicas

A minha pergunta é por isso que não é permitido?

De minha cópia do projecto parece que as seguintes coloca a restrição acima:

Em uma declaração especialização explícita para um modelo de classe, um membro de um modelo de classe ou um membro da classe modelo, o nome da classe que é explicitamente especializada deve ser um simples modelo-id.

A solução é se especializar a classe de fechamento.

Vou "ignorar" as especificações padrão e tentar um argumento lógico:

Se você tem duas classes:

class A
{
   struct S { };

};

class B: public A
{
   struct S { };
};

A :: S e B :: S são dois tipos diferentes. Estendendo a lógica para as especializações de modelo, quando você tenta se especializar uma classe interna declarado na classe de base através de uma classe interna na classe derivada, você realmente está tentando definir um tipo diferente, com o mesmo nome (mas outro escopo de nomeação).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top