Ошибка компоновщика одиночного наследования - PullRequest
0 голосов
/ 13 октября 2011

Я новичок в C ++, и я получил эту ошибку компоновщика,

LNK2001: неразрешенный внешний символ "private: статический класс DebugLog Singleton :: instance" (? Instance @? $ Singleton @ VDebugLog @@@@ 0VDebugLog @@ A)

А вот и проблемные коды:

template<typename T>
class Singleton {
public:
    static T& getInstance() {
        return instance;
    }
private:
    static T instance;
};

class DebugLog : public Singleton<DebugLog> {
public:
    void doNothing() {}
};

void main() {
    DebugLog::getInstance().doNothing();
}

Может кто-нибудь сказать мне, как я могу исправить эту ошибку компоновщика без потери наследования Singleton в DebugLog?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Вы пропустили:

template<typename T>
T Singleton<T>::instance;

Вставьте эти строки после определения вашего класса.

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

Для получения дополнительной информации прочитайте эту ссылку (Раздел: Статические члены)

1 голос
/ 13 октября 2011

Вам нужно определить экземпляр переменной static DebugLog Singleton::instance где-то в вашем коде, вы только что объявили, что она где-то существует, но на самом деле никогда не создавали ее для реального существования. Компоновщик ищет его.

Вот несколько примеров того, как это сделать правильно.

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