【发布时间】:2013-05-22 16:26:49
【问题描述】:
我认为我非常了解名称查找(在观看了几个有关它的视频并阅读了很多内容之后),但我只是遇到了这种情况:
#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& ),这似乎是唯一可能的候选者。
显然,成员函数名称隐藏了命名空间范围的名称,这让我感到惊讶,因为我记得在其他上下文中使用几乎相似的代码而没有产生此问题(但最终条件可能会非常不同)。
我的问题是:这些编译器是否符合标准?
(不幸的是,通过阅读标准文档很难理解名称查找,所以我需要专家确认)
【问题讨论】:
-
不,不。名称查找很容易。只是a simple little formula.
-
do_something不是全局的;它位于test命名空间中。 -
@chepner Truem 让我解决这个问题。
标签: c++ visual-c++ gcc c++11