1. ホーム
  2. C++

C++のコンパイルエラーで修飾子が破棄される [-fpermissive] 。

2022-02-15 08:38:31
<パス

エラーは

error: passing 'const sn::InetAddress' as 'this' argument of 'std::string sn:: InetAddress::ip_ntoa()' discards qualifiers [-fpermissive]

該当するエラーコードを抽出する。

//=========================================================
//In the TcpConnection class
void TcpConnection::showip() const
{
    cout << "ip: " << _localAddr.ip_ntoa() 
         << "port: " << _localAddr.port_ntoh() << endl
}
//==========================================================
//In the InetAddress class
string InetAddress::ip_ntoa()
{
    return string(inet_ntoa(_addr.sin_addr));
}

unsigned short InetAddress::port_ntoh()
{
    return ntohs(_addr.sin_port);
}
//==========================================================

エラーの理由は簡単です。C++では、オブジェクトへのconst参照はそのオブジェクトのconst関数にしかアクセスできません。他の関数がそのオブジェクトのメンバーを変更する可能性があり、コンパイラはそのようなことを避けるためにconstでない関数を呼ぶことは間違っていると考えているからです。

const で修飾されたメンバ関数内で、const でないメンバ関数を呼び出すことはできない、という意味です。また、error: ...discards qualifiersは、修飾子がないことを意味します。

回避策としては、InetAddress::ip_ntoa()、InetAddress::port_nto() 関数に const 修飾子 this を追加して、オブジェクトのメンバが変更されないことを示すことである。以下のようになります。

string InetAddress::ip_ntoa() const
{
    return string(inet_ntoa(_addr.sin_addr));
}

unsigned short InetAddress::port_ntoh() const
{
    return ntohs(_addr.sin_port);
}