インターフェース(すべての仮想関数を含む)にもう1つの関数が必要で、「null」にするのを忘れたときにも、同じエラーが発生します。
持っていた
class ICommProvider
{
public:
/**
* @brief If connection is established, it sends the message into the server.
* @param[in] msg - message to be send
* @return 0 if success, error otherwise
*/
virtual int vaSend(const std::string &msg) = 0;
/**
* @brief If connection is established, it is waiting will server response back.
* @param[out] msg is the message received from server
* @return 0 if success, error otherwise
*/
virtual int vaReceive(std::string &msg) = 0;
virtual int vaSendRaw(const char *buff, int bufflen) = 0;
virtual int vaReceiveRaw(char *buff, int bufflen) = 0;
/**
* @bief Closes current connection (if needed) after serving
* @return 0 if success, error otherwise
*/
virtual int vaClose();
};
最後のvaCloseは仮想ではないので、コンパイルされた場所はどこに実装するかわからず、混乱しました。私のメッセージは:
... TCPClient.o :(。rodata + 0x38): `typeinfo for ICommProvider 'への未定義の参照
からの簡単な変更
virtual int vaClose();
に
virtual int vaClose() = 0;
問題を修正しました。それが役に立てば幸い