У меня есть небольшая коллекция алгоритмов на Java для игры в несколько пошаговых игр, таких как TicTacToe, Othello, Checkers и т. Д. Я делаю это, используя Java Generics (самоограниченные типы), чтобы иметь возможность использовать одни и те же алгоритмыбез необходимости менять их специально для каждой игры.Причина, по которой я использую самоограниченные типы, здесь не показана, но необходима для функций оценки.
public interface Game<GAME extends Game<GAME>> {
GAME copy();
int getCurPlayer();
...
}
public class TicTacToe implements Game<TicTacToe> {
...
@Override
public TicTacToe copy() {
...
}
@Override
public int getCurPlayer() {
...
}
...
}
Сегодня, просто для обучения, я попытался переместить свой Java-код на C ++, используя C ++шаблоны.
Это был мой подход, и, очевидно, он не работал.
Game.h
template <typename T>
class Game
{
public:
virtual T copy() const = 0;
virtual int cur_player() const = 0;
...
};
TicTacToe.h
class TicTacToe : public Game<TicTacToe>
{
public:
virtual TicTacToe copy() const;
virtual int cur_player() const;
...
};
TicTacToe.cpp
TicTacToe TicTacToe::copy() {
...
}
int TicTacToe::cur_player() {
...
}
При попытке компилировать ошибкиЯ получаю:
out-of-line definition of 'copy' does not match any declaration in 'TicTacToe'
out-of-line definition of 'cur_player' does not match any declaration in 'TicTacToe'
... и то же самое для каждой из других чисто виртуальных функций.