gpt4 book ai didi

c++ - 无法结合模板和类函数重载

转载 作者:行者123 更新时间:2023-11-30 01:43:09 24 4
gpt4 key购买 nike

下面的代码工作正常,按预期打印出 50。然而,我不明白的是,为什么不能通过对这段代码稍作改动来编写同一个程序。建议的两行代码被标记为 Bad code 1 和 2。当它们被替换为它们左侧的当前工作代码时(即在 addStuffmain 中),我收到以下错误:

error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream}' and 'MyClass')|

我期望它工作的方式是:当 addStuff(x,y)main()< 的(坏的)cout 行中被调用时,它首先计算 x+y,其行为由 operator+ MyClass 重载成员函数定义。这应该只返回一个 MyClass 对象,然后可以毫无问题地调用 getVar。

我在这里错过了什么?

#include <iostream>
using namespace std;

class MyClass
{
public:
MyClass(){}
MyClass(int a) : priV(a){}
MyClass operator+(MyClass otherMC)
{
MyClass newMC;
newMC.priV = this->priV + otherMC.priV;
return newMC;
}
int getVar(){return priV;}
void setVar(int v){priV=v;}
private:
int priV;
};

template <class gen>
gen addStuff(gen x, gen y)
{
return x+y; //Bad code 1: return (x+y).getVar();
}

int main()
{
MyClass x(20), y(30);
cout << addStuff(x,y).getVar() << endl; //Bad code 2: cout << addStuff(x,y) << endl;
}

最佳答案

您对第 1 行 return (x+y).getVar(); 中应该发生的事情的解释是正确的。重载的 operator+ 将在参数 x 和 y 上被调用,而 getVar() 将在 operator+ 的结果上被调用。当 x 和 y 是 MyClass 类型时,operator+ 调用返回一个 MyClass 类型的对象,因此对 getVar() 的调用有效。

但是,getVar() 返回一个 int。您的函数 addStuff 被指定返回 gen,这是与参数 x 和 y 匹配的相同模板参数。这意味着当 x 和 y 是 MyClass 时,addStuff 函数必须返回 MyClass。

因此,当您将 addStuff(x,y) 放入您的 cout 语句中时,addStuff 的返回类型被推断为 MyClass .这就是使您的编译器产生“MyClass 类型没有运算符<<”错误的原因。

如果你想让addStuff返回getVar()的结果,你应该声明它返回int,而不是gen

关于c++ - 无法结合模板和类函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38206911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com