gettersがconstの場合、以下のコードが(VS2010)をコンパイルしない理由を理解できますか?資格調整(const/volatile)があいまいさを引き起こしている可能性があります
は、ここでのテストコードです:
#include <boost/system/error_code.hpp>
class socket {
public:
// setter - throw exception version
void non_blocking(bool mode)
{
// ...
}
// getter - error code version
bool non_blocking(boost::system::error_code& ec) const
{
// ...
}
// setter - error code version
void non_blocking(bool mode, boost::system::error_code& ec)
{
// ...
}
// getter - throw exception version
bool non_blocking() const
{
// ...
}
};
int main()
{
socket s;
boost::system::error_code ec;
bool result = s.non_blocking(ec);
return 0;
}
私はそのブースト::システムを知っている:: ERROR_CODEはBOOLに変換可能であるが、constのは、あいまいさを引き起こす理由を理解することはできません。ここでVS2010からのエラーメッセージがあります:
1>c:\projects\pcap++\trunk\main.cpp(145): error C2666: 'socket::non_blocking' : 2 overloads have similar conversions
1> c:\projects\pcap++\trunk\main.cpp(134): could be 'bool socket::non_blocking(boost::system::error_code &) const'
1> c:\projects\pcap++\trunk\main.cpp(129): or 'void socket::non_blocking(bool)'
1> while trying to match the argument list '(boost::system::error_code)'
1> note: qualification adjustment (const/volatile) may be causing the ambiguity
's'が' const'の場合、あいまいさはありませんでしたが、そうではなく、両方の関数を使うことができました。私はなぜあなたが最初の関数( 'bool'を持つ関数)を持っているのだろうと思っています。 – Shahbaz
これは奇妙に見えます。 'bool non_blocking'の中で' void non_blocking'を呼び出していますか? –
@Shahbaz: 'bool result = s.non_blocking(ec);'はどうですか?これはどうやって曖昧ですか?コンパイラは 'void non_blocking(bool)'とマッチできないことは明らかです。 –