我有代码:
// 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 +':重新定义;不同的类型修饰符
答案 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)
您发布的代码没有任何问题(假设内联函数定义放在正确的文件中,除了return
和operator+
上缺少的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) {
// ...
}