C++中模板函数调用前的作用域解析运算符

8

我遇到了关于模板和作用域解析运算符的问题。在一个文件中,我发现了这些代码,但是我不明白为什么我们要在调用模板函数时在前面加上::。据我所知,只有在引用全局变量时才能在变量前使用::。请问有什么想法可以帮助我吗?

#define CREATE_AND_DECODE_TYPE(Type, buffer, pType) \
    ::CreateAndDecodeType<Type>(buffer, pType, throwVarBindExceptions, static_cast<Type *>(NULL))

2
不,作用域解析运算符不仅限于变量。您可以使用它来调用函数。 - Cody Gray
1个回答

16

作用域解析运算符 ::(位于开头)强制编译器从全局作用域查找标识符,没有它时标识符相对于当前作用域查找。

namespace X
{
    namespace std
    {
        template<typename T>
        class vector {};
    }

    std::vector<int>     x;       // This is X::std::vector
    ::std::vector<int>   y;       // This is the std::vector you normally expect (from the STL)
}

2
@RaHuL: 不行。如果你使用std::vector(没有前缀::),搜索是相对于当前作用域的。这意味着编译器首先会检查X::std::vector,因为它找到了这个版本,所以它不会检查全局作用域中的版本。注意通常情况下,在当前命名空间中没有std命名空间,因此搜索将从X开始,然后回退到全局作用域并在全局命名空间中找到std,但在上述情况下,你可以看到X内有一个std - Martin York
如果您使用前缀 ::,那么编译器搜索是绝对搜索,它只会从全局命名空间中查找。 - Martin York
在实际开发中,你有多经常遇到名为std的嵌套命名空间? - Ayxan Haqverdili
1
@Ayxan,显式声明更安全。有多安全,我不知道(或没有数据)。这将取决于您使用的其他库的质量。如果您正在编写自己的应用程序,则我认为它不会有太大区别。如果您正在编写其他人使用(或错误使用)的库,则可能会拯救他们。 - Martin York
1
PS. 我在30年中只见过一次类似上述的情况(很多年前)。这是为了覆盖标准库中的某些内容,而不必进入代码并进行剪切/粘贴以更改类型名称(因为那样容易出错)。 - Martin York
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接