0

私はオブジェクトを持っています

 template <class FLOAT>
 struct Cstruct {
       Struct1<FLOAT> _var1;
       Struct2<FLOAT> _var2;   
       Cstruct(){};
       Cstruct(Struct1 var1,Struct2 var2):_var1(var1),_var2(var2){};
};

FLOAT は「double」または「int」にすることができます。Struct1 と Struct2 も FLOAT でテンプレート化されています。

今、私はグローバル変数も宣言しています

 Cstruct<double> globalObj_d;Cstruct<int> globalObj_i;

main() の中に私が持っている

main(){
  // some code
  if double then call func<double>();
  if int    then call func<int>();        

}

そして、テンプレート化された func() の中に私は持っています

template<class FLOAT> void func(){
 // some code 
 Struct1<FLOAT> var1;
 Struct2<FLOAT> var2;
 Cstruct<FLOAT> localObj(var1,var2);
 // now i want to assign "localObj" to the global object "globalObj_d"
 if double then 
     globalObj_d = localObj;
 if int then
     globalObj_i = localObj;
} 

と言うエラーが表示されます

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'Cstruct<FLOAT>

これは、 Cstruct 内に "operator=" を明示的に記述する必要があるということですか? テンプレート化されたグローバルオブジェクトの私の理解には、一種の欠陥があるようです。どんな助けでも大歓迎です。

4

3 に答える 3

0

この場合、必要になる場合があります。3 のルールを参照してください。可能であれば、コンパイラが 1 つ提供します。Struct1<FLOAT>またはの定義を示していませんStruct2<FLOAT>。これらの割り当てを生成できない場合、 の割り当ても生成できませんCStruct

そこにいる間、変数名の先頭のアンダースコアを避けてください。

于 2013-06-27T14:51:42.687 に答える
0

まず、型が浮動小数点または整数の可能性がある場合は、「FLOAT」という名前を付けないでください。標準Tの 、またはおそらく のようなものを使用できますNumberが、絶対に避けてくださいFLOAT

本当の質問 (または本当の質問に対する私の推測) について: ほとんどの場合、(少なくとも C++ では) コードの観点から、if (type == X)またはコードの種類について考えるとき、基本的な間違い犯しています。ひどくやりたい場合は、C++ が意図した動作ではありません。switch (type)

この場合、それを回避するかなり簡単な方法があります: 別のテンプレートを作成します。特に、サポートするグローバルごとに 1 つずつ、いくつかの関数テンプレートをオーバーロードできます。

#include <string>
#include <iostream>

int i_global;
double d_global;

template <class T>
void assign(T in) { 
    // this function should never be called.
    assert(false);
}

template<>
void assign<int>(int in) { 
    i_global = in;
}

template<>
void assign<double>(double in) {
    d_global = in;
}

// for the moment, func(input) will just call assign(input):
template <class T>
void func(T input) {
    assign<T>(input);
}

int main(int argc, char **argv) { 
    if (argc != 2) {
        std::cerr << "Usage: trash <number>\n";
        return EXIT_FAILURE;
    }

    std::string in(argv[1]);

    // see if the input contains a decimal point, and act accordingly:
    if (in.find('.') != std::string::npos)
        func(std::stod(in));
    else
        func(std::stoi(in));

    // show the results -- the values of the globals:
    std::cout << "Result:\ndouble: " << d_global << "\nint: " << i_global << "\n";
    return 0;
}

期待どおりの結果1.5が得られます。ダブルに割り当てられるようなものを入力すると、のようなものを入力すると123、に割り当てられintます。

于 2013-06-27T15:14:53.360 に答える