错误C2440:'初始化' :无法转换为' const temp1'到了#temp;'

时间:2016-08-20 13:10:23

标签: c++ templates

有人能告诉我为什么编译器不喜欢我的下面的代码吗?

我使用的是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'

2 个答案:

答案 0 :(得分:1)

模板是纯编译时构造。这意味着在构建代码时,所有代码都必须正确。

由于您希望根据传递的参数进行运行时选择,因此无效。

简单的解决方案是使用函数的两个重载而不是单个模板函数:一个函数以temp2作为参数,另一个函数采用typedef

在一个不相关的说明中,C ++中的结构不需要public。结构名称就像类一样是类型名称。 C ++中的类和结构几乎相同,唯一的区别是默认可见性(结构为private,类为{{1}}。

答案 1 :(得分:1)

编译器为所有可能的参数值生成模板函数的有效代码。因此,当您执行调用temp.foo(t1,1);时,它会为模板函数创建一个实例,在该实例中,它可以将t1分配给temp2,而它不能。由于x == 1与编译器无关,因此它生成的实例也可以使用x的其他值调用,因此不会执行发生的if。