2012-07-02 3 views
-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) { 
    // ... 
} 

Но я получаю errror: 'Graphic :: Point3d :: оператор +': переопределение; модификаторы разного типа

+3

Удалить встроенную функцию из определения функции – Blood

+0

'operator +' должен быть методом const. # – Puppy

+0

Какой компилятор вы используете? Для какой строки компилятор испускает ошибку? Возможно, вы определили функцию дважды, по ошибке? –

ответ

3

Код в вашем вопросе хорошо сформирован. Кандидат на выпуск Visual C++ 2012 принимает код без ошибок (я упоминаю об этом, потому что текст вашей ошибки совпадает с текстом ошибки Visual C++ C2373).

У вашего компилятора есть ошибка, или код, который вы представляете в своем вопросе, не совпадает с кодом, который вы компилируете.


В любом случае: operator+ не должен быть функцией-членом. Было бы проще использовать, не являющиеся члены функции (или два, для обработки различной упорядоченности операндов):

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

Если вы держите вашу operator+ функции (ы) член, они должны быть константной квалификацией, так что они могут быть вызывается с константной-квалифицированное слева аргумент:

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

Да. Вот что. Большое спасибо. – PolGraphic

+0

Это что-то новое/разрешенное в C++ 11?Я помню, что дискуссии об этом происходили уже много лет, и, если я правильно помню, всегда консенсус заключался в том, что указание «inline» в декларации не является необходимым, т. Е. Исходная версия кода является законной. И с каких пор 'inline' стал модификатором * типа * (ссылаясь на сообщение об ошибке)? – AnT

+0

@AndreyT: На самом деле, вы правы. В C++ 11 говорится: «Встроенная функция-член (как статическая, так и нестатическая) также может быть определена вне определения класса, если либо ее объявление в определении класса, либо его определение вне определения класса объявляет эту функцию как встроенное" (§9.3/3). Оперативное слово: _either_. 'inline' является спецификатором _функции_. C++ не использует термин _modifier_ для любого грамматического элемента. –

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) { 
    // ... 
} 
+1

Спецификатор 'inline' может принимать любое объявление, включая определение функции (которое также является объявлением). И я надеюсь, что компилятор не сказал бы «модификатор типа», когда он говорит о «спецификаторе функции». –

+0

Вы правы, я вещь –

1

код вас в курсе не имеет никаких проблем (при условии, что встроенная функция Definitio n помещается в нужный файл и кроме отсутствующего заявления return и operator+ и возможных проблем с дизайном). Он компилируется без каких-либо ошибок сообщаемого характера для нескольких компиляторов.

Если у вашего компилятора есть проблемы с тем, что функция не объявлена ​​inline в классе, это ошибка в вашем компиляторе. На языке C++ вам совершенно необходимо решить, где вы хотите разместить это inline: в классе, в определении функции или в обоих. Все являются законными, и все они имеют одинаковый эффект.

Тот факт, что компилятор, по-видимому, ссылается на inline как «модификатор типа», является еще одним признаком того, что с ним что-то не так. inline не является модификатором типа.

Однако, еще более вероятно, что компилятор полностью в порядке, и сообщение об ошибке на самом деле вызвано некоторой другой ошибкой: например, неправильно установленный спецификатор const, который либо не показан, либо неверно представлен в коде, ,

Смежные вопросы