私のプログラムでは、Socket という名前のクラスで「ソケット インターフェイス」(実際には使用している部分のみ) をラップすることにしました。AF_PACKET と AF_INET という 2 つの異なる「ドメイン」を使用しています。これらのドメインはアドレス構造が異なるため、アドレスもラップすることにしました。
次のような小さなクラスを作成しました。
class SockAddress
{
public:
SockAddress();
virtual sockaddr* getAddress();
virtual socklen_t getAddrLen();
private:
sockaddr address_;
};
このクラスに基づいて、sockaddr*
返される代わりに sockaddr_ll*` という別のクラスを作成しました。
virtual sockaddr_ll* getAddress();
...
sockaddr_ll address_;
C では、それらはすべてポインターです。sockaddr*
aが必要な場合はどこでも a を渡すsockaddr_ll*
(および対応するsocklen_t
サイズの値を渡す) 場合、問題は発生しないことを単純に知っています。
しかし、C++ でコンパイルしようとすると、invalid covariant return type
エラーが発生します。このエラーについては、こちら、こちら、こちらを既に読んでおり、その意味を理解しています。とにかく、これを「回避」する方法が見つかりませんでした。
私の質問は: ポインターを返したいので (そしてポインターは同じサイズになります)、コンパイラーに を として受け入れるように強制する方法はありsockaddr_ll*
ますsockaddr*
か? また、方法があるとすれば、どのようにすればよいでしょうか。
(方法がない場合、この問題を解決するための「正しい方法」は何でしょうか?)