help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

a compiler error in template function default argument value


From: kuangye
Subject: a compiler error in template function default argument value
Date: Wed, 9 Apr 2008 18:45:59 -0700 (PDT)
User-agent: G2/1.0

Hi, all.
I encounter a compiler error in gcc 3.4.
Is there anyone encounter the some situation. And why ???
/////////////////////////////////////
#include <iostream>
using namespace std;

#define INT_ID 1
#define FLOAT_ID 2
#define CHAR_ID 3

template<int tid>
struct Tid2T{};

#define TID2T_HELPER(id, type)\
template<>\
struct Tid2T<id>{\
typedef type TyT;\

};

TID2T_HELPER(INT_ID, int)
TID2T_HELPER(FLOAT_ID, float)
TID2T_HELPER(CHAR_ID, char)

template<int tid>
class TS{
public:
    typename Tid2T<tid>::TyT m_i;
    TS(typename Tid2T<tid>::TyT val):TS_ID(tid){
        m_i = val;
    }
    const int TS_ID;

};

template<typename Elt>
class TV;

//
//If i define the default value here, then the program will be ok.
//
template<typename Elt>
void fn(const TV<Elt>& v1, const Elt& s1/*=Elt(0)*/);

template<typename Elt>
class TV{
public:
    TV(const Elt& e):TV_TS_ID(e.TS_ID){
    }
    const int TV_TS_ID;

};

//
//If i define the default value here, then the compiler error will
appear
//
template<typename Elt>
void fn(const TV<Elt>& v1, const Elt& s1 = Elt(0))
{
    cout<<"TV_TS_ID="<<v1.TV_TS_ID<<"  TS_ID="<<s1.TS_ID<<endl;

}

template<typename T>
void tryfn()
{
    T e1(1);
    TV<T> v1(e1);

        //the following calling is error
        //why???
        fn(v1);

        //the following calling is ok
        //fn(v1, e1);

}

int main()
{
    tryfn< TS<INT_ID> >();
    tryfn< TS<FLOAT_ID> >();
    tryfn< TS<CHAR_ID> >();

    return 0;
}

////////////////////////
//////
Compiling source file(s)...
1.cpp
1.cpp: In function `void tryfn() [with T = TS<1>]':
1.cpp:74:   instantiated from here
1.cpp:63: error: no matching function for call to `fn(TV<TS<1> >&)'
1.cpp: In function `void tryfn() [with T = TS<2>]':
1.cpp:75:   instantiated from here
1.cpp:63: error: no matching function for call to `fn(TV<TS<2> >&)'
1.cpp: In function `void tryfn() [with T = TS<3>]':
1.cpp:76:   instantiated from here
1.cpp:63: error: no matching function for call to `fn(TV<TS<3> >&)'


reply via email to

[Prev in Thread] Current Thread [Next in Thread]