Включение .cpp в ошибку переопределения заголовочного файла - Реализация общего стека - PullRequest
0 голосов
/ 11 марта 2012

Для моего класса CS Data Structures я реализую универсальный стек, используя связанный список.Тем не менее, я получаю ошибки «Переопределение ....» для всех моих конструкторов и функций в моем файле .cpp.Файл заголовка «Stach.h» был предоставлен инструктором, а в конце она включила «Stack.cpp».Все отлично работает, когда я закомментирую эту строку, но она хочет этого там.Кто-нибудь когда-нибудь слышал об этом?

Спасибо, ребята,

Дэвид

Ответы [ 3 ]

2 голосов
/ 11 марта 2012

Ваш инструктор не прав.Вы не включаете cpp файлы в заголовочные файлы.

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

Что может сработать, если вы объявите реализации как inline, но этовсе еще довольно противный.

РЕДАКТИРОВАТЬ: Видя, как классы являются шаблонами, я могу вспомнить одну проблему, заключающуюся в том, что вы специализируете его для одного и того же типа дважды.Я бы удалил файл cpp из компиляции, хотя, если вы можете, вы должны изменить расширение на impl или что-то еще.Таким образом, компилятор не будет компилировать его отдельно, но он все равно будет доступен для файлов, которые специализируются на вашем классе.

1 голос
/ 11 марта 2012

Единственный раз, когда я включил файл .cpp, это когда я хотел поместить реализацию шаблона в файл .cpp, чтобы мой редактор распознал его как C ++ вместо C. Является ли реализация стекашаблон?

Если это так, то реализация методов шаблона должна быть доступна для модулей компиляции, которые их используют.Обычно вы используете .ipp или .tcc для шаблона файлов реализации, если вы собираетесь реализовать что-то другое, чем в самом заголовке.Это то, что делают Boost и ряд других библиотек.Если это так, то вам не нужно компилировать stack.cpp , так как компилятор позаботится об этом, когда ваша клиентская или драйверная программа включает файл заголовка.

0 голосов
/ 11 октября 2017

Причина: в ваш файл Stach.h вы включаете файл Stach.cpp с помощью директивы #include, которая копирует и вставляет во время препроцессора код Stach.cpp внутри файла Stach.h
, вероятноВаш файл CMakeLists.txt в команде << set (SOURCE_FILES ..) >> вы также связываете и файл Stach.h, и файл Stach.cpp.
Итак, код Stach.cpp существует в Stach.h и самом Stach.cpp, поэтому компоновщик уведомляет вас о существовании переопределения.
QuickFix: измените имя файла Stach.cpp на Stach.anotherExtension (см. Предыдущийкомментарии :))
BestFix: удалить Stach.cpp из CMakeLists.txt

...