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

在您的问题中使用 psudocode 使其难以理解。所以让我试着把它归结为真正的代码。看来您要尝试做的事情基本上是这样的:

template <typename VAL>
class Foo
{
public:
  VAL mVal;
};

int main()
{
  Foo <int> global_i;
  Foo <double> global_d;

  Foo <double> local;

  // ...
  if (/*someConditional*/)
    global_i = local;  // <== LINE 1
  else
    global_d = local;  // <== LINE 2
}

这行不通。请注意,即使在运行时仅执行LINE1或中的一个LINE2,它们也会在编译时编译。第一个是尝试将 a 分配Foo<int>给 a Foo<double>,但是这些类型不太兼容,就像它们也不兼容一样:

class Gee
{
};

class Whiz
{
};

int main()
{
  Gee g;
  Whiz w;

  Gee local;
  local = w;  // <<< INCOMPATIBLE TYPES
}

为了使这项工作,您将需要提供某种转换运算符Foo以转换为另一种类型Foo,例如:

template <typename VAL>
class Foo
{
public:
  template <typename OTHER> operator Foo <OTHER> () const 
  {
    Foo <OTHER> ret;
    // ...
    return ret;
   }
};

...或者也许提供两个单独的功能来完成分配;一个用于 a Foo<int>,另一个用于 a Foo<double>

于 2013-06-27T15:04:53.187 回答
0

首先:如果一个类型可能是浮点数或整数,请不要将其命名为“FLOAT”。您可以使用标准T,或者类似的东西Number,但绝对避免FLOAT

至于真正的问题(或我对真正问题的猜测):几乎任何时候你用代码if (type == X)switch (type)某种代码来思考(至少在 C++ 中),你都犯了一个根本性的错误——你可能会设法做到这一点如果您想做得不够好,但这不是 C++ 的工作方式。

在这种情况下,有一个相当简单的方法可以避免它:创建另一个模板。特别是,您可以重载几个函数模板,每个要支持的全局函数模板:

#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 回答
0

在这种情况下,您可能需要这样做。见三法则如果可以的话,编译器会为你提供一个。您还没有向我们展示Struct1<FLOAT>or的定义Struct2<FLOAT>。如果它不能为这些生成分配,它就不能为CStruct.

当您在那里时,请避免变量名的前导下划线

于 2013-06-27T14:51:42.687 回答