私は奇妙な演算子を持っています< <問題がありますが、その理由はわかりません。次のコードは問題の抽出です。このコードは、VS2015、g ++ 5.4.0、およびclang 3.8.0を使用してコンパイルできないため、コンパイラのバグではありません。演算子<<オーバーロードが他のものを隠す
#include <iostream>
#include <stdexcept>
inline std::ostream &operator<<(std::ostream &o, const std::exception &ex) {
o << ex.what();
return o;
}
namespace ns {
struct Struct { int m; };
inline std::ostream &operator<<(std::ostream &o, const Struct &s) {
o << s.m;
return o;
}
void fn() {
std::cout << Struct{ 1 } << std::endl;
try {
throw std::runtime_error("...");
} catch (std::exception &ex) {
std::cout << ex << std::endl;
}
}
}
int main() {
return 0;
}
コンパイラは、STDのためのオペレータ< <の過負荷を見つけることができません::例外(ライン "のstd :: coutを< <元< <のstd ::てendl;" 失敗しました)。私はグローバル名前空間のコードがコンパイルさ
に名前空間NSからすべてのコードを移動した場合
- がオーバーロード演算子構造体の< <または
- を削除します。どちらかのI場合はどう特に私を混乱することは、あります。この行動の理由は何ですか?
あなたはコンパイラのメッセージやエラーを投稿するのを止めましたか? – Nawaz
@Nawaz:何がOPを停止したのか分かりませんが、1つの理由は、GCCで今試したときのエラーメッセージが202行と16799文字であったという理由があります。 Bjarneが彼のオーバーロードされた暗黙の空白は承認を得ることができなかったが、C++は確かにそのエラーメッセージで私たちを荒しするために管理しています... –
はああ申し訳ありません:VS2015は述べています:**重大\tコード\t説明\tプロジェクト\tファイル\tライン\t抑制状態 エラー\t C2679 \tバイナリ '<<': 'std :: exception'(または受け入れ可能な変換はありません)タイプの右オペランドをとる演算子は見つかりません**。 –