有人能告诉我为什么编译器不喜欢我的下面的代码吗?
我使用的是VS2010。我不能使用C ++ 11或更高版本。我在头文件中有一个模板函数定义,我从另一个cpp文件中调用该函数。
header.h
typedef struct temp1
{
int x;
double d;
}
temp1;
typedef struct temp2
{
double d;
int x;
}
temp2;
class A
{
public:
A();
~A();
public:
template<typename T1> void foo(const T1& xx, int x)
{
if( 1 == x )
{
temp1 t1 = xx;
// Do some operation
}
if (2 == x )
{
temp2 t2 = xx;
// Do some operation
}
}
};
Source.cpp
int _tmain(int argc, _TCHAR* argv[])
{
A temp;
temp1 t1;
t1.x = 10;
t1.d = 10.10;
temp2 t2;
t2.x = 20;
t2.d = 20.20;
temp.foo(t1,1);
temp.foo(t2,2);
return 0;
}
编译器报告错误:
Error 1 error C2440: 'initializing' : cannot convert from 'const temp1' to 'temp2'
Error 2 error C2440: 'initializing' : cannot convert from 'const temp2' to 'temp1'
答案 0 :(得分:1)
模板是纯编译时构造。这意味着在构建代码时,所有代码都必须正确。
由于您希望根据传递的参数进行运行时选择,因此无效。
简单的解决方案是使用函数的两个重载而不是单个模板函数:一个函数以temp2
作为参数,另一个函数采用typedef
。
在一个不相关的说明中,C ++中的结构不需要public
。结构名称就像类一样是类型名称。 C ++中的类和结构几乎相同,唯一的区别是默认可见性(结构为private
,类为{{1}}。
答案 1 :(得分:1)
编译器为所有可能的参数值生成模板函数的有效代码。因此,当您执行调用temp.foo(t1,1);
时,它会为模板函数创建一个实例,在该实例中,它可以将t1分配给temp2,而它不能。由于x == 1与编译器无关,因此它生成的实例也可以使用x
的其他值调用,因此不会执行发生的if。