C ++ множественное определение оператора >> - PullRequest
5 голосов
/ 18 апреля 2011

Я использую предложенное решение @Martin для синтаксического анализа csv с C ++ , так как я пытаюсь избежать использования таких библиотек, как boost и тому подобных, для моего текущего проекта.Я поместил его реализацию в заголовок "csv.h" и пытаюсь включить его в некоторые другие файлы.Я продолжаю получать следующую ошибку

multiple definition of operator>>(std::basic_istream<char, std::char_traits<char> >&, CSVRow&)

, когда пытаюсь построить проект - я предполагаю, что это происходит потому, что переопределение operator>> конфликтует с исходным.Как я могу заставить этих двоих играть красиво?спасибо.

Ответы [ 4 ]

8 голосов
/ 18 апреля 2011

Скорее всего, у вас есть один и тот же оператор, включенный в несколько модулей компиляции (например, файлы cpp), поэтому вы получаете один и тот же сгенерированный код, компоновщик, который просматривает все файлы .obj, чтобы собрать их вместе, и видит кратные значения.

У вас есть 3 варианта:

  • пометить его как статический - это сделает оператор видимым только для файла, в котором он был.
  • пометить его как встроенный - это избавитсяфункции и вставляет код в точке использования.
  • Поместите прототип в заголовок, а тело - в собственный файл cpp.
4 голосов
/ 18 апреля 2011

Я поместил его реализацию в заголовок "csv.h"

В этом проблема.Пожалуйста, поместите его в csv.cpp файл.: -)

2 голосов
/ 18 апреля 2011

Отметить как встроенный.

inline istream & operator>>( istream & is, CSVRow & row ) {
    // stuff
}
0 голосов
/ 18 апреля 2011

Еще лучше, так что вы можете отделить свой код от кода библиотеки, вы можете создать в своем проекте папку, содержащую файл C ++ и заголовок с ним. Затем вы можете в своем файле Makefile / Makefile.am / CMakeLists создать статический архив (.a), который вы можете добавить в основную программу, когда закончите.

Таким образом, гораздо более понятно, что код является отдельным и многократно используемым компонентом, который на самом деле не зависит ни от чего другого (что может быть полезно для иерархии папок, если вы решите следовать этому шаблону).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...