模板/命名空间交互

时间:2010-02-12 02:00:58

标签: 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();
}

将在using namespace ONE时返回1,在using namespace TWO时返回2.

为什么呢?名称空间和模板之间是否存在其他“奇怪”或“意外”的交互?

编辑:当时令人困惑,因为在多个文件中使用了相同的模板,每个using都有不同的命名空间。

2 个答案:

答案 0 :(得分:6)

这并不意外。你没有限定你想要的foo,所以你的using声明告诉编译器在哪里找到它。

我在生产代码中看到的最糟糕的模板问题与非依赖名称查找有关。它非常复杂,所以最好只指向C++ FAQ Lite(第35.18-20节)。

答案 1 :(得分:6)

我不确定这里有什么令人惊讶的。当你说using namespace ONE时,你将ONE :: foo带到范围,现在被识别为foo。在上面的代码中,模板获取TWO :: foo作为其参数。它与模板无关,当您调用bar<T>::stuff()时,main()中正在进行的所有事情都会发生。