gpt4 book ai didi

c++ - 带有运算符的好奇重复模板

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

我在 G++ 上工作,但在 Visual Studo 2008 上无法编译。

template<typename T, typename DerivedT >
struct Foo
{
template<typename Scale>
DerivedT operator * (const Scale i)
{
DerivedT result;
return result;
}
};

template<typename T>
struct Bar : public Foo<T, Bar<T> >
{
// Removing this operator gets rid of the error.
Bar& operator * (const Bar& boo)
{
return *this;
}
};

int main()
{
Bar<float> bar;
bar = bar * 3;

return 0;
}

我得到了错误

Error   1   error C2679: binary '*' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)

即使我将 Foo 运算符明确定义为 int/double/float,它也会返回相同的错误消息。有什么办法可以克服这个问题吗?

编辑:只有当派生类重载也在基类中定义的运算符 * 时,这才会崩溃。

最佳答案

我不知道你是如何通过 g++ 编译它的(我真的怀疑这一点),但你的代码确实不可编译,原因很明显。您的 Bar 类仅公开一个 operator *

Bar& operator * (const Bar& boo)

并且该运算符需要一个 Bar 对象作为右侧大小的操作数。 3 将不起作用,3 不是 Bar 并且不能转换为 Bar

基类的 operator * 可能在这里起作用,但它被派生类的运算符隐藏了。这就是为什么,正如人们所期望的那样,删除派生类的 operator * 可以消除错误。

你可以简单地添加

using Foo<T, Bar<T> >::operator *;

Bar 的定义取消隐藏基类的运算符,它应该编译。

关于c++ - 带有运算符的好奇重复模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5592929/

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