我遇到了一个编译..奇怪的地方?最近,这让我相信模板在创建时是在与声明 where 相同的 namespace (或者至少 using
相同的 namespace )中创建的。也就是;
template<class T>
class bar
{
public:
static int stuff(){return T::stuff();}
};
namespace ONE
{
struct foo
{
static int stuff(){return 1;}
};
}
namespace TWO
{
struct foo
{
static int stuff(){return 2;}
};
}
using namespace TWO;
int main()
{
return bar<foo>::stuff();
}
使用命名空间 ONE
时将返回 1,使用命名空间 TWO
时将返回 2。
为什么?命名空间和模板之间是否存在其他“奇怪”或“意外”的交互?
编辑:这在当时令人困惑,因为在多个文件中使用相同的模板,每个文件使用
不同的命名空间。
最佳答案
这并不意外。您没有限定您想要的 foo
,因此您的 using
声明告诉编译器在哪里可以找到它。
我在生产代码中看到的最糟糕的模板陷阱与非依赖名称查找有关。它非常复杂,所以最好只指向 C++ FAQ Lite。 (第 35.18-20 节)。
关于c++ - 模板/命名空间交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2249201/