2016-08-20 25 views
1

コンパイラが私の下のコードを好まない理由を知ってもらえますか?エラーC2440: '初期化': 'const temp1'から 'temp2'に変換できません

私は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' 

答えて

1

テンプレートは純粋なコンパイル時構成です。これは、コードをすべてビルドするときに正しいことを意味します。

渡された引数によって実行時の選択を行いたいので、動作しません。

単一のテンプレート関数ではなく、関数の2つのオーバーロードがあります:temp1を引数とする関数と、temp2を受け取る関数です。無関係なノートで


、あなたはC++の構造体のための typedefを必要としません。構造体名は、クラスのように型名です。クラスと構造体はC++でほぼ同じですが、唯一の違いはデフォルトの可視性(構造体の場合は public、クラスの場合は private)です。

+0

説明をありがとう –

1

コンパイラは、すべての可能なパラメータ値に対してテンプレート関数の有効なコードを生成します。したがって、temp.foo(t1,1);というコールを実行すると、t1をtemp2に割り当てることができないテンプレート関数のインスタンスが作成されます。 x == 1は、xの他の値でも呼び出すことができるインスタンスを生成するため、x == 1はコンパイラには関係がないため、ifが発生することはありません。

関連する問題