ошибка LNK2005: уже определенный - C++

Вы можете сортировать с помощью java 8

yourList.sort(Comparator.comparing(Classname::getName));

or

yourList.stream().forEach(a -> a.getBObjects().sort(Comparator.comparing(Classname::getValue)));
14
задан Navaneeth K N 7 March 2009 в 18:05
поделиться

5 ответов

Вы, которых любой имеет к

  • перемещение SetPersonName определение .cpp файлу, компилируете и связываетесь с получающейся целью
  • , делают SetPersonName встроенный

, Это - известный случай Одного нарушения Правила Определения.

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

22
ответ дан 1 December 2019 в 10:04
поделиться

Когда Вы компилируете, Вы - библиотека, ее библиотечный файл содержит определение для SetPersonName. При компиляции программы, которая пользуется библиотекой, так как она включает заголовок, и Вы написали код, встроенный в заголовке, который она также компилирует в определении для SetPersonName. Два определения для той же функции (обычно) не позволяются. Статическое ключевое слово говорит компилятору, что функция не должна быть представлена за пределами текущей единицы перевода (дискретная часть кода, который Вы компилируете), таким образом, определение в библиотеке не видимо компоновщику.

соответствующее решение этой проблемы зависит от Ваших целей. Заголовочные файлы со статическими объявлениями функции почти никогда не, что Вы хотите. С точки зрения дизайна я рекомендовал бы избавиться от SetPersonName в целом и просто использовал бы Человека:: SetName.

Однако сбой, что, я реализовал бы его во многом как, Вы сделали для остальной части Вашей функциональности, объявлений в заголовке и реализации в .cpp. Подставляемые функции, связанные с библиотекой, будут иметь тенденцию уменьшать многие преимущества пользования библиотекой во-первых.

3
ответ дан 1 December 2019 в 10:04
поделиться

Решение состояло бы в том, чтобы сделать ту функцию статическим методом. Это остановит "уже определенные" ошибки.

0
ответ дан 1 December 2019 в 10:04
поделиться

Путем объявления функциональных помех Вы определяете объем его к текущей единице перевода, поэтому в действительности Вы добавили новую функцию SetPersonName в своем основном файле и назвали бы это не тем определенный в библиотеке.

правильное решение состоит в том, чтобы объявить SetPersonName как экстерна в person.h и реализовать его в person.cpp

Person.h

extern void SetPersonName(Person& person,const std::string name);

Person.cpp

void SetPersonName(Person& person,const std::string name)
{
    person.SetName(name);
}
1
ответ дан 1 December 2019 в 10:04
поделиться
  1. функциональный SetPersonName будет скомпилирован в каждый objectfile, который включает файл Person.h, таким образом делая компоновщика, видящего несколько функций и дающего ошибку.

  2. Путем записи статичный Вы заявляете, что функция только будет видима в единственном objectfile. Вы все еще получите несколько функций в Вас двоичный файл, но теперь Вы не получите ошибки.

  3. Попытка записать inline перед функцией как

    inline void SetPersonName(Person& person,const std::string name)
    {
        person.SetName(name);
    }
    

    ..., потому что функция довольно проста, она в порядке, я думаю, чтобы иметь ее как встроенное. Встроенное поместит необходимый код, где функция используется, на самом деле не создавая функцию, которую назовут.

1
ответ дан 1 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: