为特定类型参数设置未知类型的初始值或重载运算符 我仍然在学习C++和篡改操作符超载。< /P>

为特定类型参数设置未知类型的初始值或重载运算符 我仍然在学习C++和篡改操作符超载。< /P>,c++,operator-overloading,C++,Operator Overloading,现在,我必须生成一个输出,虽然我不知道输入时它将是什么样的数据类型-它在makefile中指定,可以是double、struct或enum 代码优先: #include <iostream> #define TYPE Complex //#define TYPE Symbol //#define TYPE double using namespace std; struct Complex { double Re; double Im }; enum Symb

现在,我必须生成一个输出,虽然我不知道输入时它将是什么样的数据类型-它在
makefile
中指定,可以是
double
struct
enum

代码优先:

#include <iostream>

#define TYPE Complex
//#define TYPE Symbol
//#define TYPE double

using namespace std;

struct Complex {
    double Re;
    double Im
};

enum Symbol {
    a, b, c, d, e
};

struct Vector {
    TYPE Data[4];
    //more in struct, but it's irrelevant
};

// operator * overloads for Complex and Symbol here
// output stream operator for Vector, Symbol and Complex
// are also overloaded

TYPE operator * (Vector A, Vector B) {
    TYPE Output;
    int i;

    for (i=0; i<4; i++) {
        Output = A.Data[i] * B.Data[i];
    }

    return Output;
    // the output is garbage, because TYPE Output is not
    // set (to 0) at the beginning
}

int main {
    TYPE x;
    // ...
    x = SomeVectorA * SomeVectorB;
    cout << x << endl;
    // ...
    return 0;
}
对于
符号

Symbol X;
X = e;
而对于
加倍
,则一如既往

我提出的解决方案是为特定类型重载
操作符

double operator * (Vector A, Vector B);   // [1]
Symbol operator * (Vector A, Vector B);   // [2]
Complex operator * (Vector A, Vector B);  // [3]
但是编译器给我带来了错误,因为我已经重载了
[3]
,虽然对于
复杂的
[1]
类型作为输入,但在
[1]
之后,由于数据类型不兼容,我无法再执行
2.05*1.1

我还考虑将
Init()
函数添加到
struct Complex
struct Vector
。但它不适用于
enum

检查
类型
也不起作用,因为编译器仍然会抛出错误

问题

类型运算符*(向量A、向量B)
中,是否可以为不同的输入参数设置不同的重载过程,或者至少采取措施避免返回奇怪的输出?

尝试调用默认构造函数,例如:

TYPE Output = TYPE();

尝试调用默认构造函数,例如:

TYPE Output = TYPE();

所有这些实际上都不是初始化。任何初始化都将在
Complex中完成
符号X语句。这些都不是真正的初始化。任何初始化都将在
Complex中完成
符号X声明。谢谢-它就像一个符咒。它是如此的琐碎,以至于我已经忘记了它,特别是如果我总是在C#…中使用它,那真是太遗憾了。谢谢,它就像一个符咒。它是如此的琐碎以至于我已经忘记了它,特别是如果我总是在C#中使用它,那真是太遗憾了。。。