#include <iostream>
template < typename T>
struct traits1{
static T add( T a, T b) { return a+ b; } /* default */
static T mul( T a, T b) ; /* no default */
} ;
template < typename T>
struct traits2{
static T add( T a, T b) ;
static T mul( T a, T b) ;
} ;
template <>
int traits2< int > :: add ( int a, int b) { return a* b; }
int main( )
{
std:: cout << traits1< int > :: add ( 40 , 2 ) << "\n " ;
// error: mul is not a member of traits1<int>
std:: cout << traits1< int > :: mul ( 40 , 2 ) << "\n " ;
std:: cout << traits2< int > :: add ( 40 , 2 ) << "\n " ;
// error: undefined reference to traits2<int>::mul(int, int)
std:: cout << traits2< int > :: mul ( 40 , 2 ) << "\n " ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IHRyYWl0czF7CiAgc3RhdGljIFQgYWRkKFQgYSwgVCBiKSB7IHJldHVybiBhK2I7IH0gLyogZGVmYXVsdCAqLwogIHN0YXRpYyBUIG11bChUIGEsIFQgYik7ICAgICAgICAgICAgICAgIC8qIG5vIGRlZmF1bHQgKi8KfTsKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgdHJhaXRzMnsKICBzdGF0aWMgVCBhZGQoVCBhLCBUIGIpOwogIHN0YXRpYyBUIG11bChUIGEsIFQgYik7Cn07Cgp0ZW1wbGF0ZTw+CmludCB0cmFpdHMyPGludD46OmFkZChpbnQgYSwgaW50IGIpIHsgcmV0dXJuIGEqYjsgfQoKaW50IG1haW4oKQp7CiAgc3RkOjpjb3V0IDw8IHRyYWl0czE8aW50Pjo6YWRkKDQwLCAyKSA8PCAiXG4iOwoKICAvLyBlcnJvcjogbXVsIGlzIG5vdCBhIG1lbWJlciBvZiB0cmFpdHMxPGludD4KICBzdGQ6OmNvdXQgPDwgdHJhaXRzMTxpbnQ+OjptdWwoNDAsIDIpIDw8ICJcbiI7CgogIHN0ZDo6Y291dCA8PCB0cmFpdHMyPGludD46OmFkZCg0MCwgMikgPDwgIlxuIjsKICAvLyBlcnJvcjogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byB0cmFpdHMyPGludD46Om11bChpbnQsIGludCkKICBzdGQ6OmNvdXQgPDwgdHJhaXRzMjxpbnQ+OjptdWwoNDAsIDIpIDw8ICJcbiI7CiAgcmV0dXJuIDA7Cn0=
compilation info
/home/XWFTpj/cckiScdw.o: In function `main':
prog.cpp:(.text+0x8a): undefined reference to `traits1<int>::mul(int, int)'
prog.cpp:(.text+0xf2): undefined reference to `traits2<int>::mul(int, int)'
collect2: ld returned 1 exit status
stdout