C++ C2679二进制'-=';:未找到接受类型为';的右操作数的运算符;T';(或没有可接受的转换)
我创建了一个Vector类,它包含3个参数并重载了-=运算符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)
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这是一个输入错误。我忘了它是复合赋值运算符。我认为它是负号运算符。:)