首页 > 解决方案 > 模板化运算符重载不能绑定非常量左值引用

问题描述

我尝试了 const 的变体和通过引用传递,但似乎在每个走廊都有问题。此配置给出错误无法将“thingArr&”类型的非常量左值引用绑定到“thingArr”类型的右值我做错了什么?

#include <iostream>
using namespace std;
template <typename T>
class thingArr
{
public:
  thingArr(){for(int i=0;i<4;++i)n[i] = 1;}
  thingArr(thingArr& mIn){for(int i=0; i<4; ++i)n[i]=mIn.n[i];}
  friend std::ostream& operator << (std::ostream& s, thingArr<T>& m)
  {
    s<<"\n("<<m.n[0]<<", "<<m.n[1]<<", "<<m.n[2]<<", "<<m.n[3]<<")";
    return s;
  }
  friend thingArr operator * (thingArr inThingArr, T inScalar)
  {
    thingArr out(inThingArr);
    for(int i=0;i<4;++i)out.n[i]*=inScalar;
    return thingArr(out);
  }

  T n[4];
};

main(){
  thingArr<float> A;
  thingArr<float> B;
  B = A * .25;
  cout <<"A: "<<A<<endl;
  cout <<"B: "<<B<<endl;
}

标签: c++templatesoperator-overloadingfriend

解决方案


感谢 SM,我有一个工作版本:

#include <iostream>
using namespace std;
template <typename T>
class thingArr
{
public:
  thingArr(){for(int i=0;i<4;++i)n[i] = 1;}
  thingArr(const thingArr& mIn){for(int i=0; i<4; ++i)n[i]=mIn.n[i];}
  friend std::ostream& operator << (std::ostream& s, thingArr<T>& m)
  {
    s<<"\n("<<m.n[0]<<", "<<m.n[1]<<", "<<m.n[2]<<", "<<m.n[3]<<")";
    return s;
  }
  friend thingArr operator * (const thingArr& inThingArr, T inScalar)
  {
    thingArr out(inThingArr);
    for(int i=0;i<4;++i)out.n[i]*=inScalar;
    return thingArr(out);
  }

  T n[4];
};

main(){
  thingArr<float> A;
  thingArr<float> B;
  B = A * .25;
  cout <<"A: "<<A<<endl;
  cout <<"B: "<<B<<endl;
}

推荐阅读