c++ - 模板/命名空间交互

标签 c++ templates namespaces

我遇到了一个编译..奇怪的地方?最近,这让我相信模板在创建时是在与声明 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/

相关文章:

c++ - T&&(双与号)在 C++11 中是什么意思?

c++ - RVO应该什么时候启动?

c++ - 具有模板参数的类成员包含另一个具有参数的模板类

c++ - 自动推导返回和参数类型的仿函数

c++ - 类命名空间内的模板特化

C++ 串联和字符串化运算符

python - django - 将参数从模板传递到 models.py 的函数

c++ - 如果参数与数据成员同名怎么办?

c++ - 嵌套命名空间中的前向声明

c++ - 如何调试 Visual C++ 9 中的缓冲区溢出?