Многократная ошибка переопределения - PullRequest
2 голосов
/ 29 октября 2010

Узнав больше о классах и указателях, я реорганизовал программу, которая у меня была, и уничтожил> 200 строк кода, создав в процессе два других класса, Location и Piece. Проблема в том, что после компиляции всего, компоновщик жалуется, что конструктор для Piece определен несколько раз с множеством ошибок:

In function 'Piece':                                         board.o
multiple definition of 'Piece::Piece(int)`                   char_traits.h
In function 'Piece':                                         board.o
multiple definition of 'Piece::Piece(int)`                   piece.cpp
In function 'Piece':                                         player.o
multiple definition of 'Piece::Piece(int)`                   piece.cpp
In function 'Piece':                                         player.o
multiple definition of 'Piece::Piece(int)`                   piece.cpp (yes, same exact error!)
In function 'Piece':                                         refereee.o
multiple definition of 'Piece::Piece(int)`                   char_traits.h
In function 'Piece':                                         referee.o
multiple definition of 'Piece::Piece(int)`                   piece.cpp
...

Когда я нажимаю на ошибку для char_traits.h, это приводит меня к следующему:

static size_t
length(const char_type* __s) //error points here to line 262
{ return __builtin_strlen(__s); }

Другой char_traits.h подводит меня к

  static int
  compare(const char_type* __s1, const char_type* __s2, size_t __n) //line 258, error points here too
  { return __builtin_memcmp(__s1, __s2, __n); }

И, как вы знаете, location.h - это единственное, что включает в себя piece.h (ну, другие файлы включают в себя piece.h косвенно из location, включая piece.h), board.h это единственное, что включает в себя location. ч, и куча классов включает в себя board.h

Я попытался изменить защиту заголовка на _OTHELLO_PIECE_H и попытался переименовать класс в OPiece (через IDE). Ни одна из них не устранила проблему.

Самое смешное, что в одной из ошибок есть «in function 'OPiece':», и после этого моя IDE помещает chatter.o, хотя ни chatter.h, ни chatter.cpp не содержат ничего, что включает OPiece.

Есть идеи, что может быть причиной этой ошибки переопределения?

Ответы [ 5 ]

4 голосов
/ 29 октября 2010
  1. Восстановить все
  2. Найдите Piece :: Piece и удалите все из заголовочных файлов. 2b. Никогда не включайте .cpp файлы
  3. Ищите #define, которое разрешается в Piece
2 голосов
/ 29 октября 2010

Самая распространенная причина ошибки определения нескольких функций - это помещение определения функции в заголовочный файл и его отсутствие inline.

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

1 голос
/ 29 октября 2010

есть два места для реализации Piece::Piece(int) в типичной сборке:

1) интерфейс (при объявлении)

class Piece {
    int d_a;
public:
    Piece(int a) : d_a(a) {
    }
    /* ... */
};

2) в выделенном файле cpp

в шт.hpp

class Piece {
    int d_a;
public:
    Piece(int a);
    /* ... */
};

в Piece.cpp

Piece::Piece(int a) : d_a(a) {
}

однако шаблоны определены по-разному.

ошибка часто означает, что Piece::Piece(int a) : d_a(a) {} включено в несколько файлов cpp.

каждый созданный объектный файл добавляет символ Piece::Piece(int) там, где он виден.

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

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

#warning Piece::Piece(int) is visible here
Piece::Piece(int a) : d_a(a) {
}

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

1 голос
/ 29 октября 2010

Вы должны поместить реализацию конструктора в piece.cpp, а не непосредственно в piece.h.

0 голосов
/ 29 октября 2010

Просто предположение: вы использовали #include или #import случайно - что случилось со мной однажды: -)

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