は、次のコードを考えてみましょう:C++の過負荷解決ルールの欠陥?
#include <iostream>
namespace ns1
{
struct A
{
};
template <class T>
std::ostream& operator << (std::ostream& os, const T& t)
{
return os << "ns1::print" << std::endl;
}
}
namespace ns2
{
template <class T>
std::ostream& operator << (std::ostream& os, const T& t)
{
return os << "ns2::print" << std::endl;
}
void f (const ns1::A& a)
{
std::cout << a;
}
}
int main()
{
ns1::A a;
ns2::f (a);
return 0;
}
コンパイルは標準どおり「あいまいな過負荷エラー」で失敗します。
なぜですか?確かにAの「ホーム」ネームスペースの「同等に良い」演算子が優先されるべきですか?それをしない論理的な理由はありますか?
なぜ 'A 'の「ホーム」名前空間の関数が、呼び出し関数fの名前空間の関数よりも優先されるべきだと思いますか?これをあいまいにする方法はありません。エラーは唯一の賢明なことです。 –
名前空間より作成した人は、Aをどのように印刷するべきかが分かりますか? – cppalex
まず、テンプレートです。 「A」を作成した人が、タイプAのオブジェクトを印刷するための特定の動作を保証したい場合、それらは過負荷または特殊化のいずれかを提供していたであろう。それはここのあいまいさを解決したでしょう。第二に、名前空間は複数回開いたり閉じたりすることができるので、関数はAの実装者によって提供されていなくてもよい。 –