作为基础 class 引用的派生 class 函数参数导致 C2678
Derived class function parameter as base class reference is causing C2678
我制作了 'Derived' class,它派生了 'Base' class。它正在使用 CRTP。 Base class 包含一个一元运算符和一个二元运算符。 Derived class 正在实现那些虚拟运算符函数。
template <typename T> class Base
{
public:
virtual bool operator==(T operand) = 0;
virtual bool operator!() = 0;
};
class Derived : public Base<Derived>
{
public:
virtual bool operator==(Derived operand){ return true; }
virtual bool operator!(){ return false; }
};
模板函数notf 和equalf 用于测试Derived class 的成员运算符。函数 notf 通过引用获取一个 Base,并调用它的 !操作员。函数 equalf 做类似的事情。
template <typename T> bool notf(Base<T>& x)
{
return !x;
}
template <typename T> bool equalf(Base<T>& x, Base<T>& y)
{
return x == y;
}
然后主函数调用那些模板函数。
int main()
{
Derived x, y;
cout << notf(x);
cout << equalf(x, y);
return 0;
}
equalf 函数产生 C2678 错误。编译器说,error C2678: binary '==' : no operator found which takes a left-hand operand of type 'Base<Derived>' (or there is no acceptable conversion)
。但我不知道是什么问题,因为 notf 功能运行良好。当代码编译除equalf函数时,效果很好。
当我做equalf函数显示参数类型时,它显示"class Derived"和"class Derived"。如果是这样,那么为什么错误消息显示 left-hand operand of type 'Base<Derived>'
?
Base<T>::operator==(T operand)
不能接受 Base<T>
参数(因为没有定义转换)。
很难提出修复建议,因为代码指向许多可能的设计方向。
然而,无论如何,虚拟比较运算符或虚拟赋值的想法通常是不好的,因为它将类型检查移到了 运行 时间,因此您需要更多的测试和更复杂的代码。
我制作了 'Derived' class,它派生了 'Base' class。它正在使用 CRTP。 Base class 包含一个一元运算符和一个二元运算符。 Derived class 正在实现那些虚拟运算符函数。
template <typename T> class Base
{
public:
virtual bool operator==(T operand) = 0;
virtual bool operator!() = 0;
};
class Derived : public Base<Derived>
{
public:
virtual bool operator==(Derived operand){ return true; }
virtual bool operator!(){ return false; }
};
模板函数notf 和equalf 用于测试Derived class 的成员运算符。函数 notf 通过引用获取一个 Base,并调用它的 !操作员。函数 equalf 做类似的事情。
template <typename T> bool notf(Base<T>& x)
{
return !x;
}
template <typename T> bool equalf(Base<T>& x, Base<T>& y)
{
return x == y;
}
然后主函数调用那些模板函数。
int main()
{
Derived x, y;
cout << notf(x);
cout << equalf(x, y);
return 0;
}
equalf 函数产生 C2678 错误。编译器说,error C2678: binary '==' : no operator found which takes a left-hand operand of type 'Base<Derived>' (or there is no acceptable conversion)
。但我不知道是什么问题,因为 notf 功能运行良好。当代码编译除equalf函数时,效果很好。
当我做equalf函数显示参数类型时,它显示"class Derived"和"class Derived"。如果是这样,那么为什么错误消息显示 left-hand operand of type 'Base<Derived>'
?
Base<T>::operator==(T operand)
不能接受 Base<T>
参数(因为没有定义转换)。
很难提出修复建议,因为代码指向许多可能的设计方向。
然而,无论如何,虚拟比较运算符或虚拟赋值的想法通常是不好的,因为它将类型检查移到了 运行 时间,因此您需要更多的测试和更复杂的代码。