【问题标题】:What causes C++ compiler error: must have argument of class or enumerated type?是什么导致 C++ 编译器错误:必须有类或枚举类型的参数?
【发布时间】:2011-09-21 02:29:51
【问题描述】:

函数声明:


template <typename T>
Point<T>* operator +(Point<T> const * const point, Vector<T> const * const vector);

自从我使用 C++ 以来已经有一段时间了,所以也许我正在做一些非常愚蠢的事情。告诉我。

另外,不,我没有使用命名空间标准。

【问题讨论】:

    标签: c++ compiler-errors


    【解决方案1】:

    您在语言级别上做错的是为指针重载运算符。重载运算符的至少一个参数必须是用户定义的类型,或者是对某个类型的引用。

    但你在另一个层面上也做错了。您正在返回一个指针,这意味着您可能需要在运算符中动态分配一些存储空间。那么,谁拥有那个存储空间?谁来发布?

    您应该只获取引用并按值返回,例如:

    template <typename T>
    Point<T> operator +(Point<T> const& point, Vector<T> const& vector) {
        return Point<T>(point.x + vector.x, point.y + vector.y);
    }
    

    【讨论】:

    • 我返回指针的原因之一是我不知道如何按值返回。我从哪里得到这个 Point ?我不能制作一个 new() 并像这样返回它。
    • @Doug:我添加了一个示例,考虑了典型的 Point 和 Vector 类。如果你是Java出身,首先要知道new的使用频率很高。
    • 这有什么样的分配?它是否以某种方式与调用函数有关?
    • @Doug:它是这个函数的本地(它被称为自动存储,与动态存储相反),但它会被复制到返回值(编译器是允许的,并且很可能会将副本优化掉,所以不要担心副本会减慢您的速度)。它也会自行清理。很抱歉,上面关于new 我的意思是“经常使用。”
    • 是的,我担心自动存储会超出范围并被释放,但似乎这是一种避免释放的方法,因为它被复制到返回值。或者实际上,它会被释放并且复制的效率会很低,但编译器可能会优化它,从而再次提高效率(希望不会构造两次值)。
    【解决方案2】:

    您不能为基本类型重载运算符,在您的情况下,两个参数都是指针。您是否想要参考资料?

    【讨论】:

    • 所以即使它是指向某个特定类型的指针,我仍然不能重载它?
    • @DougTreadwell 很难有不指向特定类型的指针,不是吗? ;)
    • 我的意思是,指向用户定义的类型。但我想编译器不会看它指向什么,只是看它是什么?
    【解决方案3】:

    定义运算符时,至少有一个参数必须是用户定义的类或枚举类型(或对其中之一的引用)。指针不属于其中任何一个。您应该使用引用参数,并返回一个不合格的 Point

    【讨论】:

    • 如何返回不合格的点
    猜你喜欢
    • 2017-08-01
    • 2011-03-31
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多