Nar*_*tor 0 c++ templates namespaces
我遇到了编译......奇怪的?最近,这让我相信模板在创建时会在与声明位置相同的名称空间(或者至少using是相同的名称空间)中创建.那是;
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();
}
Run Code Online (Sandbox Code Playgroud)
将返回1时using namespace ONE和2时using namespace TWO.
为什么?名称空间和模板之间是否存在其他"奇怪"或"意外"的交互?
编辑:这在当时令人困惑,因为在多个文件中使用相同的模板,每个文件都是using不同的命名空间.
这并不意外.你没有符合foo你想要的资格,所以你的using声明告诉编译器在哪里找到它.
我在生产代码中看到的最糟糕的模板问题与非依赖名称查找有关.它非常复杂,所以最好只指向C++ FAQ Lite(第35.18-20节).
我不确定这里有什么令人惊讶的.当你说using namespace ONE你把ONE :: foo带到范围时,现在被认为是foo.在上面的代码中,模板获取TWO :: foo作为其参数.它与模板无关,当你打电话时,正在进行的所有事情都在main()中进行bar<T>::stuff().
| 归档时间: |
|
| 查看次数: |
2017 次 |
| 最近记录: |