[VC++] Partieel gespecialiseerde template wil niet werken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Ik probeer een set partieel gespecialiseerde template classes aan de gang te krijgen in VC++ 2010, maar het wil niet werken. Ik heb de code teruggebracht tot het volgende:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
template< class A, class enable = void > class TestTemplate
{
    A data;
public:
    void Functie( void )
    {
        printf( "ongespecialiseerd\n" );
    }
};

template<class A> class specialize {};
template<> class specialize<int> { typedef bool yes; };

template< class A > class TestTemplate< A, typename specialize<A>::yes >
{
public:
    void Functie( void )
    {
        printf( "gespecialiseerd\n" );
    }
};

int main( void )
{
    TestTemplate<double> a;
    TestTemplate<int> b;
    a.Functie();
    b.Functie();
    return 0;
}
b.Functie() zou 'gespecialiseerd' moeten geven, maar doet dat niet.
Ik kan trouwens in de gespecialiseerde functie syntaxfouten maken, de compiler klaagt niet. Dus blijkbaar wordt de hele gespecialiseerde template overgeslagen.
Wat zie ik over het hoofd?

/Edit: Ik heb de code net gecompileerd met gcc 4.4.5, en dan werkt het ook niet. Dus het is geen MS quirk.

[ Voor 5% gewijzigd door Mijzelf op 07-09-2011 16:54 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Wat je nu hebt geschreven is een specialisatie voor TestTemplate<int, bool>. maar je instantieert TestTemplate<int, void>.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:28

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als ik het goed begrijp wil je TestTemplate<T> specializen afhankelijk van of specialize<T> een bepaalde waarde heeft? En dan waarschijnlijk omdat het wat onhandig is om de definitie van TestTemplate<T> elke keer te herhalen voor elk gespecialized type? Dan kun je dat beter zo aanpakken:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
template<class A> struct specialize { static const bool value = false; }; 
template<> struct specialize<int> { static const bool value = true; }; 

template< class A, bool enable = specialize<A>::value> class TestTemplate 
{ 
    A data; 
public: 
    void Functie( void ) 
    { 
        printf( "ongespecialiseerd\n" ); 
    } 
}; 

template< class A > class TestTemplate< A, true > 
{ 
public: 
    void Functie( void ) 
    { 
        printf( "gespecialiseerd\n" ); 
    } 
}; 

int main( void ) 
{ 
    TestTemplate<double> a; 
    TestTemplate<int> b; 
    a.Functie(); 
    b.Functie(); 
    return 0; 
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Mijzelf
  • Registratie: September 2004
  • Niet online
Die code werkt inderdaad, bedankt.