ソケット通信のラッパクラスを書いていて遭遇したこと.ソケットは関係ないのですが.
まず,以下のようなbasic_socketという基底クラスを作成しました.
template < int Type, int Family = AF_INET > class basic_socket { public: ... virtual socket_type open(); virtual void open(); ... private: ... }
次に,このクラスを継承してbasic_sockserverというクラスを作成しました.
template < int Type = SOCK_STREAM, int Family = AF_INET > class basic_sockserver : public basic_socket{ public: ... virtual socket_type open(int port, int n = 100); ... pvivate: ... }
役割的には,basic_socketのopen()はシステムコールのopenを呼ぶだけで,basic_sockserver()のopen()はその後の初期処理(bind, listen, ...)も行います.それで,basic_sockserverのopen()でbasic_socketのopen()をコールしようと,this->open()と記述したところ,
../clx/socktcp.h:46: error: no matching function for call to ` clx::basic_sockserver<1, 2>::open()' ../clx/socktcp.h:45: error: candidates are: socket_type clx::basic_sockserver::open(int, int) [with int Type = 1, int Family = 2]
とコンパイルエラーが発生しました.これをbasic_socket側をopen_tmp()というメソッド名にして同様のことを行う(this->open_tmp()とコール)とコンパイルエラーは発生しませんでした.
サブクラス側に同名のメソッドが存在すると,引数が違っても見えなくなってしまうんですねー(basic_socket::open()と明示するといけるようですが).