operator +':redefinition;不同类型的修饰符

时间:2012-07-02 16:22:09

标签: c++ operator-keyword redefinition

我有代码:

// class declaration
class Vector3D;

// class declaration and definition
class Point3D { 
    // ...

    // function declaration (only needs class declarations)
    Point3D operator+(const Vector3D &);
};

// class definition
class Vector3D {
    // ...
};

// function definition (needs class definitions)
inline Point3D Point3D::operator+(const Vector3D &vector) {
    // ...
}

但我收到错误: 'Graphic :: Point3D :: operator +':重新定义;不同的类型修饰符

3 个答案:

答案 0 :(得分:3)

您问题中的代码格式正确。 Visual C ++ 2012 Release Candidate接受代码没有错误(我提到这一点,因为您的错误文本与Visual C ++错误C2373的相同)。

您的编译器有错误,或者您在问题中提供的代码与您编译的代码不同。


在任何情况下:operator+不需要是成员函数。使用非成员函数(或两个,处理不同的操作数排序)会更简单:

Point3D operator+(Point3D  const& lhs, Vector3D const& rhs);
Point3D operator+(Vector3D const& lhs, Point3D  const& rhs);

如果确实保留了operator+成员函数,那么它们应该是const限定的,以便可以使用const限定的左手参数调用它们:

Point3D operator+(const Vector3D &) const;
                                    ^ const required

答案 1 :(得分:1)

您发布的代码没有任何问题(假设内联函数定义放在正确的文件中,除了returnoperator+上缺少的inline语句以及可能的设计问题)。它在几个编译器上编译时没有报告任何错误。

如果您的编译器在类中没有声明函数inline的问题,那么它就是编译器中的错误。在C ++语言中,您完全可以决定将inline:放在类中,函数定义中还是两者中。一切都是合法的,都具有相同的效果。

编译器似乎将inline称为“类型修饰符”这一事实是另一个迹象,表明它存在问题。 const不是类型修饰符。

但是,编译器更可能完全正常,错误消息实际上是由其他一些错误引起的:例如,错误放置的{{1}}说明符,在代码中未显示或错误表示剪了你的帖子。

答案 2 :(得分:0)

试试这个:

// class declaration
class Vector3D;

// class declaration and definition
class Point3D { 
    // ...

    // function declaration (only needs class declarations)
    inline Point3D operator+(const Vector3D &);
};

// class definition
class Vector3D {
    // ...
};

// function definition (needs class definitions)
inline Point3D Point3D::operator+(const Vector3D &vector) {
    // ...
}