2011-07-21 15 views
17

Mam szablonie klasy z matrycy funkcji członkaSpecjalizacja matrycy funkcji członka w szablonie klasy

template<class T> 
class A { 
public: 
    template<class CT> 
    CT function(); 
}; 

teraz chcę się specjalizować w szablonie funkcji członka na 2 sposoby. Po pierwsze za to, że ten sam typ jak klasa:

template<class T> 
template<> // Line gcc gives an error for, see below 
T A<T>::function<T>() { 
    return (T)0.0; 
} 

sekundę typu bool:

template<class T> 
template<> 
bool A<T>::function<bool>() { 
    return false; 
} 

Oto jak próbuję go przetestować:

int main() { 
    A<double> a; 
    bool b = a.function<bool>(); 
    double d = a.function<double>(); 
} 

Teraz gcc daje mi dla linii zaznaczonej powyżej:

error: invalid explicit specialization before ‘>’ token 
error: enclosing class templates are not explicitly specialize 

Więc gcc mówi mi, że muszę specjalizować A, jeśli chcę specjalizować się w funkcji, prawda? Nie chcę tego robić, chcę, aby typ zewnętrznej klasy był otwarty ...

Czy ostateczna odpowiedź: nie jest możliwe? A może jest jakiś sposób?

+0

Możliwy duplikat http://stackoverflow.com/q/3040201/498253 – Tom

Odpowiedz

13

Tak, to jest problem:

error: enclosing class templates are not explicitly specialized 

Nie można specjalizować członek bez również specjalizujący klasę.

Co może zrobić, to umieścić kod z function w oddzielnej klasie i specjalizują się, że podobnie jak basic_string zależy na osobnej klasy char_traits. Wtedy nie wyspecjalizowany function może wywołać pomocnika w klasie cech.

6

Możesz użyć przeciążenia, jeśli zmienisz implementację.

template <typename T> 
class Foo 
{ 
public: 
    template <typename CT> 
    CT function() { return helper((CT*)0); } 

private: 
    template <typename CT> 
    CT helper(CT*); 

    T helper(T*) { return (T)0.0; } 

    bool helper(bool*) { return false; } 
}; 

Proste i łatwe :)

Powiązane problemy