久しぶりに昔作ったC++のアプリを改造しようとして、せっかくだから言語バージョン更新しようかなと思い、C++11からC++17に置き換えました。
C++17に変更してビルドしてみると、早速下記のエラーが。
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared\rpcndr.h(192,14): error C2872: 'byte': あいまいなシンボルです。
なんぞこれと思い、調べてみるとMicrosoft Developer Communityに似たようなエラー報告のスレを発見。
https://developercommunity.visualstudio.com/t/error-c2872-byte-ambiguous-symbol/93889
ここに以下の回答がありました。
これは誰にでもできる回避策だと思いますが、多少の修正は必要です。これは、"/std:c++17"を使用している場合にのみ発生します。"std:c++14"までは問題ありません。これは、"std::byte"がc++17で追加されたからです。また、問題のあるWindowsヘッダの前に「using namespace std;」が宣言されている場合にのみ発生します。問題となっているWindowsヘッダーを "using namespace std;"の前に記述します。これにより、"std::byte"がグローバルスコープにない場合でも、Windowsヘッダーが処理されるようになり、曖昧さがなくなります。もし、"using namespace std;"を使い続けていて、どちらかのbyte型を使用する必要がある場合は、まだ方法があります。"std::byte"を使用するには、そのように入力します。ここだけは、"std::"を避けることはできません。Windowsのヘッダ"byte"を使いたい場合は、"::byte"と入力します。どちらにしても曖昧さはありません。
私はヘッダー内で using namespace std; をすることが悪だという認識は昔からあったので、まさか自分がそんなことはやっていないだろうと、ソースコードを全検索してみたところ、見つかる見つかるw どうやら、元々.cpp に書いていたコードを後からインライン化したくなって、.h にコピーした時に消し忘れた残骸がたくさん残っていました。
ということで、私のケースでは全てのヘッダーファイルから using namespace std;を削除する事でビルドが通るようになりました。大がかりな修正にならなくて良かったです。