K
kuangye
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;
}
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;
}