私は名前検索を非常によく理解していると思っていました (それに関するいくつかのビデオを見て、たくさん読んだ後) が、私はちょうどこのケースにぶつかりました:
#include <iostream>
namespace test{
struct Id
{};
void do_something( const Id& ){ std::cout << "Hello, World!" << std::endl; }
class Test
{
public:
void do_something() { std::cout << "WTF!" << std::endl; }
void run()
{
Id id;
do_something( id ); // doesn't compile
}
};
}
int main()
{
test::Test my_test;
my_test.run();
}
指摘された行は (GCC4.8 および VC11U2 で) コンパイルされません 。これは、唯一の可能な候補のように見えるtest::Test::do_something()
名前空間スコープの代わりにメンバー関数を使用しようとするためです。test::do_something( const Id& )
どうやら、メンバー関数名は名前空間スコープの名前を隠しているようです。これは、この問題が発生することなく、他のコンテキストでほぼ同様のコードを使用したことを覚えているためです (ただし、最終的には条件が大きく異なる可能性があります)。
私の質問は、これらのコンパイラは標準に準拠していますか?
(残念ながら標準文書を読んでも名前の参照は非常にわかりにくいので、専門家の確認が必要です)