У меня небольшие проблемы с использованием виртуальных функций в C ++, и я могу неправильно использовать их в конструкторе. Проблема заключается в том, что при связывании компонента lib (написанного мной) с моим последним исполняемым файлом виртуальная функция помечается как неопределенная, хотя я написал для нее реализацию и связал ее.
У меня есть следующий класс:
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()
{
}
Как видите, я вызываю виртуальную функцию в своем конструкторе. Насколько я могу судить, это должно быть хорошо, так как я знаю, что мой конструктор подкласса не был вызван, поэтому я не могу использовать переменные экземпляра, но я просто добавляю несколько специфичных для подкласса элементов станд :: карта.
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
Что я здесь не так делаю? Пожалуйста, спросите, нужна ли вам дополнительная информация, хотите, чтобы она была максимально короткой!