C++17にしたら「rpcndr.h(192,14): error C2872: 'byte': あいまいなシンボルです」が発生

2021/10/23
C++ 

久しぶりに昔作った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;を削除する事でビルドが通るようになりました。大がかりな修正にならなくて良かったです。



  このエントリーをはてなブックマークに追加  

<<「ソフトウェア開発」の記事一覧に戻る

関連記事