Виртуальная функция C ++ не определена во время компоновки - почему?

У меня небольшие проблемы с использованием виртуальных функций в C ++, и я мог неправильно использовать их в конструкторе. Проблема в том, что при связывании библиотеки компонентов (написанной мной) с моим окончательным исполняемым файлом виртуальная функция помечается как неопределенная, хотя я написал для нее реализацию и связал ее.

У меня есть следующий класс:

template<class BufferType, class ConnectionType, class HandlerType>
class UdpConnection
{
public:
UdpConnection(size_t dispatchCount) : service(),
        listener(service),
        pool(dispatchCount), sysMsgHandlers(),
        bufferPool(), buffers()
    {
        assert(dispatchCount > 0);
        initBuffers(dispatchCount);
        initSysHandlers();
    }
protected:
    virtual void initSysHandlers() = 0;
}

В моем подклассе:

class UdpClient : public UdpConnection<SyncBufferHandler, UdpClient, ClientNetworkHandler>
{
    protected:
        void initSysHandlers();
}

И исходный файл подкласса:

void UdpClient::initSysHandlers()
{

}

Как видите, я вызываю виртуальную функцию в своем конструкторе. Насколько я могу судить, это должно быть нормально, поскольку я знаю, что мой конструктор подкласса не был вызван, поэтому я не могу использовать какие-либо переменные экземпляра, но я просто добавляю несколько конкретных элементов подкласса в std :: map.

Linking CXX static library libnetwork.a
[ 75%] Built target network                                                                                           
Scanning dependencies of target testclient
[ 87%] Building CXX object CMakeFiles/testclient.dir/src/test/testclient.cpp.o                                        
Linking CXX executable testclient                                                                                     
src/network/libnetwork.a(udpclient.cpp.o): In function `voip::network::UdpConnection<voip::network::client::SyncBufferHandler, voip::network::client::UdpClient, voip::network::client::ClientNetworkHandler>::UdpConnection(unsigned long)':
udpclient.cpp:(.text._ZN4voip7network13UdpConnectionINS0_6client17SyncBufferHandlerENS2_9UdpClientENS2_20ClientNetworkHandlerEEC2Em[voip::network::UdpConnection<voip::network::client::SyncBufferHandler, voip::network::client::UdpClient, voip::network::client::ClientNetworkHandler>::UdpConnection(unsigned long)]+0x10d): undefined reference to `voip::network::UdpConnection<voip::network::client::SyncBufferHandler, voip::network::client::UdpClient, voip::network::client::ClientNetworkHandler>::initSysHandlers()'
collect2: ld returned 1 exit status

Что я здесь делаю не так? Пожалуйста, спросите, нужна ли вам дополнительная информация, хотелось бы сделать ее как можно короче!

7
задан Max 12 February 2011 в 20:23
поделиться