Является ли «позиция» зарезервированным словом в C ++? - PullRequest
0 голосов
/ 24 февраля 2012

Вот упрощенная версия моего кода, который компилируется:

#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() определяется только в одном месте, вопреки сообщению об ошибке ... если только я что-то серьезно не замечаю.Это довольно рано.

Ответы [ 6 ]

2 голосов
/ 24 февраля 2012

Проблема в том, что вы компилируете код, содержащийся в position.cpp дважды , и пытаетесь связать скомпилированный код в один файл.

Проблема вызвана этой строкой в ​​main.cpp:

#include "position.cpp"

Вы включаете исходный файл C ++, а не заголовок. Это означает, что весь код в position.cpp включен в main.cpp, а затем полученный файл скомпилирован. Затем вы компилируете position.cpp самостоятельно.

Попробуйте вместо этого включить position.h - если такого заголовка еще нет, определите его. Альтернативное решение - не добавлять position.cpp в список источников для компиляции.

2 голосов
/ 24 февраля 2012

Вы не должны #include "position.cpp" в своем главном файле, а вместо этого - файл заголовка для класса position.

1 голос
/ 24 февраля 2012

Вы включаете postition.cpp в main.cpp, возможно, ваша система сборки также собирает position.cpp отдельно, а затем компоновщик находит несколько определений вашего класса.

Вы должны сделать отдельный заголовок и добавить включающие охранники, #pragma once, например, на msvc

0 голосов
/ 24 февраля 2012

Компилятор / компоновщик работает с единицами перевода, а не с файлами. Вы можете иметь определение position :: print в одном файле (position.cpp). Но определение фактически присутствует в двух единицах перевода, так как вы написали #include "position.cpp". Вы нарушили ODR (одно правило определения).

0 голосов
/ 24 февраля 2012

Это не зарезервированное слово, это имя, которое вы использовали в position.cpp. Вы используете то же имя, но другое значение в main.cpp.

0 голосов
/ 24 февраля 2012

В сообщении об ошибке указывается, что у вас есть два определения void position::print(), одно в main.cpp, другое в position.cpp.

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