ソケット通信のラッパクラスを書いていて遭遇したこと.ソケットは関係ないのですが.
まず,以下のような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()と明示するといけるようですが).