Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C2679二进制'-=';:未找到接受类型为';的右操作数的运算符;T';(或没有可接受的转换)_C++_Templates_Operator Overloading - Fatal编程技术网

C++ C2679二进制'-=';:未找到接受类型为';的右操作数的运算符;T';(或没有可接受的转换)

C++ C2679二进制'-=';:未找到接受类型为';的右操作数的运算符;T';(或没有可接受的转换),c++,templates,operator-overloading,C++,Templates,Operator Overloading,我创建了一个Vector类,它包含3个参数并重载了-=运算符 template <class T> class Static3Vector { public: Static3Vector() : m_coords{ 0, 0, 0 } {} Static3Vector(T x, T y, T z) : m_coords{ x, y, z } {} T operator [] (const size_t& i)

我创建了一个Vector类,它包含3个参数并重载了-=运算符

template <class T>
class Static3Vector
    {
    public:
        Static3Vector() : m_coords{ 0, 0, 0 } {}
        Static3Vector(T x, T y, T z) : m_coords{ x, y, z } {}

        T operator [] (const size_t& i) { return m_coords[i]; }
        T operator [] (const size_t& i) const { return m_coords[i]; }

        Static3Vector operator -= (const Static3Vector& rhs)    
        {
          for (int i = 0; i < sizeof(m_coords) / sizeof(m_coords[0]); i++) 
             this[i] -= rhs[i];
          return *this; 
        }
    private:
        T m_coords[3];
    };
模板
类Static3Vector
{
公众:
Static3Vector():m_坐标{0,0,0}{}
Static3Vector(tx,tyt,tz):m_坐标{x,y,z}{
T运算符[](常量大小T&i){返回m_坐标[i];}
T运算符[](常数大小T&i)常数{返回m_坐标[i];}
Static3Vector运算符-=(常量Static3Vector和rhs)
{
对于(int i=0;i
但是当我尝试使用这个操作符时

Static3Vector<int> vec1(1,2,3);
Static3Vector<int> vec2(1,2,3);
vec1 -= vec2;
static3vec1(1,2,3);
静态向量向量向量2(1,2,3);
vec1-=vec2;

我得到了我在标题中输入的错误。

这是一个指针,
这[I]
并没有达到你的预期。它接受
这个
并执行指针算法。
i
唯一不是UB的值是
0
,该表达式的类型是
Static3Vector

这相当于:

Static3Vector<int> vec1(1,2,3);
Static3Vector<int>* ptr = &vec1;
ptr[0]; //ok, equivalent to *ptr
ptr[1]; //compiles, but invokes UB

还有一件事:前两个不适用于当前的实现,因为
操作符[]
返回它存储的值的副本。
操作符[]
返回对存储对象的引用更为典型:

    T& operator [] (const size_t& i) { return m_coords[i]; }
    const T& operator [] (const size_t& i) const { return m_coords[i]; }

另请参见

是一个指针,
此[i]
并没有达到您的预期。它接受
这个
并执行指针算法。
i
唯一不是UB的值是
0
,该表达式的类型是
Static3Vector

这相当于:

Static3Vector<int> vec1(1,2,3);
Static3Vector<int>* ptr = &vec1;
ptr[0]; //ok, equivalent to *ptr
ptr[1]; //compiles, but invokes UB

还有一件事:前两个不适用于当前的实现,因为
操作符[]
返回它存储的值的副本。
操作符[]
返回对存储对象的引用更为典型:

    T& operator [] (const size_t& i) { return m_coords[i]; }
    const T& operator [] (const size_t& i) const { return m_coords[i]; }

另请参见

查看索引运算符:

T operator [] (const size_t& i) { return m_coords[i]; }
T operator [] (const size_t& i) const { return m_coords[i]; }
它们之间唯一的区别是,一个对象被称为常量对象,这就引出了一个问题:为什么要复制它们

这很容易回答:
两者都应该返回引用,后者
const
-限定,以避免复制并允许修改第一个引用

将其作为解决错误的第一步进行修复



第二步,认识到
是在引用存在之前引入的,因此是指向实例的指针,而不是引用,因此
此[n]
是指针算术,而不是调用自定义索引运算符。谢天谢地,这会导致不同的类型,从而导致重载解析失败。

请查看您的索引运算符:

T operator [] (const size_t& i) { return m_coords[i]; }
T operator [] (const size_t& i) const { return m_coords[i]; }
它们之间唯一的区别是,一个对象被称为常量对象,这就引出了一个问题:为什么要复制它们

这很容易回答:
两者都应该返回引用,后者
const
-限定,以避免复制并允许修改第一个引用

将其作为解决错误的第一步进行修复



第二步,认识到
是在引用存在之前引入的,因此是指向实例的指针,而不是引用,因此
此[n]
是指针算术,而不是调用自定义索引运算符。谢天谢地,这会导致不同的类型,从而导致重载解析失败。

下标运算符的使用不正确。在运算符定义中,例如

    Static3Vector operator -= (const Static3Vector& rhs)    
    {
      for (size_t i = 0; i < sizeof(m_coords) / sizeof(m_coords[0]); i++) 
         this[i] -= rhs[i];
      return *this; 
    }
指针类型为
Static3Vector*
的对象使用了b内置下标运算符

你需要写作

         ( * this )[i] -= rhs[i];

此外,返回类型应为参考类型,如

    T &  operator [] (const size_t& i) { return m_coords[i]; }
    const T & operator [] (const size_t& i) const { return m_coords[i]; }

Static3Vector和操作符-=(const Static3Vector和rhs)
{
对于(size_t i=0;i
下标运算符的使用不正确。在运算符定义中,例如

    Static3Vector operator -= (const Static3Vector& rhs)    
    {
      for (size_t i = 0; i < sizeof(m_coords) / sizeof(m_coords[0]); i++) 
         this[i] -= rhs[i];
      return *this; 
    }
指针类型为
Static3Vector*
的对象使用了b内置下标运算符

你需要写作

         ( * this )[i] -= rhs[i];

此外,返回类型应为参考类型,如

    T &  operator [] (const size_t& i) { return m_coords[i]; }
    const T & operator [] (const size_t& i) const { return m_coords[i]; }

Static3Vector和操作符-=(const Static3Vector和rhs)
{
对于(size_t i=0;i
const Static3Vector和operator-=(const Static3Vector和rhs)const不是正在为const对象调用吗?为什么我要从常量对象中减去?@SzymonO这是一个输入错误。我忘了它是复合赋值运算符。我认为它是负号操作符。:)const Static3Vector&operator-=(const Static3Vector&rhs)const对象不是被调用了吗?为什么我要从常量对象中减去?@SzymonO这是一个输入错误。我忘了它是复合赋值运算符。我认为它是负号运算符。:)