-1

我有代码:

// 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 +' : redefinition; 不同的类型修饰符

4

3 回答 3

3

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

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


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

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
于 2012-07-02T16:23:08.093 回答
1

您发布的代码没有任何问题(假设内联函数定义放置在正确的文件中,除了缺少的return声明operator+和可能的设计问题)。它在几个编译器上编译时没有任何报告性质的错误。

如果您的编译器在类中未声明该函数这一事实存在问题,inline则这是您的编译器中的一个错误。在 C++ 语言中,完全由您决定要将其放置在何处inline:在类中、在函数定义中或两者中。所有都是合法的,并且都具有相同的效果。

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

但是,更有可能编译器完全正常,错误消息实际上是由其他一些错误引起的:const例如,一个错误放置的说明符,在您发布的代码中未显示或错误表示。

于 2012-07-02T16:45:36.367 回答
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) {
    // ...
}
于 2012-07-02T16:31:17.690 回答