Вот упрощенная версия моего кода, который компилируется:
#include <iostream>
class pos
{
public:
char (&board)[64];
pos(char (&arr)[64])
: board(arr)
{
*board = *arr;
}
void print();
};
void pos::print()
{
for (int y=0; y<8; y++)
{
for (int x=0; x<8; x++)
std::cout << (int) board[x + y*8] << " ";
std::cout << "\n";
}
}
int main()
{
char test[64] = {
0, 1, 2, 3, 4, 5, 6, 7,
1, 2, 3, 4, 5, 6, 7, 8,
2, 3, 4, 5, 6, 7, 8, 9,
3, 4, 5, 6, 7, 8, 9,10,
4, 5, 6, 7, 8, 9,10,11,
5, 6, 7, 8, 9,10,11,12,
6, 7, 8, 9,10,11,12,13,
7, 8, 9,10,11,12,13,14 };
pos p(test);
p.print();
std::cin.get();
return 0;
}
Но если я изменяю все экземпляры pos
на position
, я получаю ошибку: main.obj: error LNK2005: "public: void __thiscall position :: print (void) "(? print @ position @@ QAEXXZ) уже определено в position.obj 1> D: \ Programming \ Test \ Debug \ Test.exe: фатальная ошибка LNK1169: одно или несколько умноженийнайдено определенных символов
Как ни странно, класс имел имя position
и прекрасно компилировался, пока я не внес некоторые изменения в то, как он обрабатывает массив board
.Может кто-нибудь объяснить, почему я получаю эту ошибку?
Обновление
Теперь не имеет значения, как называется класс, я получаю ту же ошибку.Я создал новый проект MSVC ++, скопировал исходные файлы и сделал новую сборку.Та же ошибка.Вот фактический код, вместо краткой версии.
main.cpp
#include <iostream>
#include "position.cpp"
int main()
{
char test[64] = { // Simple mate test position; TODO: move to test suite
OO,BK,OO,OO,OO,OO,OO,OO,
OO,OO,OO,OO,OO,OO,OO,WR,
OO,WK,OO,OO,OO,OO,OO,OO,
OO,OO,OO,OO,OO,OO,OO,OO,
OO,OO,OO,OO,OO,OO,OO,OO,
OO,OO,OO,OO,OO,OO,OO,OO,
OO,OO,OO,OO,OO,OO,OO,OO,
OO,OO,OO,OO,OO,OO,OO,OO };
position pos(test);
pos.print();
std::cin.get();
return 0;
}
position.cpp
#include <iostream>
// Board-centric representation; pass as 64-byte array
#define WK 0x0 // White King
#define WQ 0x1 // White Queen
#define WR 0x2 // White Rook
#define WB 0x3 // White Bishop
#define WN 0x4 // White Knight
#define WP 0x5 // White Pawn
#define BK 0x6 // Black King
#define BQ 0x7 // Black Queen
#define BR 0x8 // Black Rook
#define BB 0x9 // Black Bishop
#define BN 0xA // Black Knight
#define BP 0xB // Black Pawn
// 0xC: unused
// 0xD: unused
// 0xE: unused
#define OO 0xF // Empty
class position
{
public:
char (&board)[64];
position(char (&arr)[64]) // TODO: 'board' dies if the variable passed through 'arr' dies. Allocating memory might fix this. See 'new' and 'shared_ptr'.
: board(arr)
{
*board = *arr;
}
void print();
};
void position::print()
{
for (int y=0; y<8; y++)
{
for (int x=0; x<8; x++)
std::cout << (int) board[x + y*8] << " ";
std::cout << "\n";
}
}
(я пишу программу для рисункаиз простых шахматных финалов.)
Как видите, position::print()
определяется только в одном месте, вопреки сообщению об ошибке ... если только я что-то серьезно не замечаю.Это довольно рано.