オーバーライドの副作用?

ソケット通信のラッパクラスを書いていて遭遇したこと.ソケットは関係ないのですが.


まず,以下のような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()と明示するといけるようですが).