Comprendre (simple?) C ++ Spécialisation de modèle partiel

Remarque: ce qui semble être un repost d'un problème: C++ - Surcharge basé sur un modèle de la méthode de classe, une partie specilization de cette méthode

J'ai cuit un problème que j'ai avec C++ template de la spécialisation vers le bas pour un cas simple.

Il se compose d'un simple 2-paramètre de la classe de modèle Thingoù je tiens à se spécialiser Thing<A,B>::doSomething() pour B=int.

#include <cstdio>

//
//A 3-parameter template class.
//
template <class A, class B>
class Thing
{
public:
    Thing(A a, B b) : a_(a), b_(b) {}
    B doSomething();
private:
    A a_;
    B b_;
};

//
//The generic case works as expected.
//
template <class A, class B>
B Thing<A,B>::doSomething()
{
    return b_;
}

//
//This specialization does not work!
//
template <class A>
int Thing<A,int>::doSomething()
{
    return b_+1;
}

int main( int argc, char** argv )
{
    //Setup our thing.
    Thing<double,int> thing(1.0,2);
    //This doesn't compile - but works with the generic case.
    printf("Expecting 3, and getting %i\n", thing.doSomething());
    //Clean up.
    return 0;
}

Malheureusement, g++ se termine avec l'erreur:

partial_specialization.cpp:30: error: invalid use of incomplete type class Thing<A, int>’
partial_specialization.cpp:8: error: declaration of class Thing<A, int>’

La clang++ compilateur est un peu plus verbeux, mais a le même problème:

partial_specialization.cpp:30:19: error: nested name specifier 'Thing<A, int>::' for declaration does not
      refer into a class, class template or class template partial specialization
int Thing<A,int>::doSomething()
    ~~~~~~~~~~~~~~^
partial_specialization.cpp:32:12: error: use of undeclared identifier 'b_'
    return b_+1;
           ^
2 errors generated.

J'ai lu et entendu que partielle spécialisations de modèle sur les fonctions ne sont pas admis - mais j'ai pensé que j'étais partiellement spécialisé sur les classes de Thing dans ce cas.

Des idées?

Ce que j'ai fait: Une solution de contournement, comme déterminé dans le lien fourni par le a accepté de répondre:

template< class T >
inline T foo( T const & v ) { return v; }

template<>
inline int foo( int const & v ) { return v+1; }

//
//The generic case works as expected.
//
template <class A, class B>
B Thing<A,B>::doSomething()
{
    return foo(b_);
}

source d'informationauteur Dan | 2011-05-26