首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在名称空间foo中声明swap(),然后在同一个名称空间下使用swap()而不是foo::swap()是否意味着foo::swap()?

在名称空间foo中声明swap(),然后在同一个名称空间下使用swap()而不是foo::swap()是否意味着foo::swap()?
EN

Stack Overflow用户
提问于 2016-01-04 19:54:06
回答 4查看 72关注 0票数 1

我的问题很简单。这样做安全吗?

不需要任何道德建议,如“不要命名您的函数交换()!”或者随便什么拜托!

file1.hpp

代码语言:javascript
复制
//header guards here
#include <utility>  //includes std::swap and std::move

namespace foo 
{
    template<typename T>
    inline void swap(T& lhs, T& rhs)
    {
        T temp = std::move(lhs);
        lhs = std::move(rhs);
        rhs = std::move(temp);
    }
}

file2.cpp

代码语言:javascript
复制
#include "file1.hpp"

namespace foo
{
    template<typename T>
    void myfun(T a, T b) 
    { 
        a += b; 
        swap(a, b);  //does it imply foo::swap, because the function
                     //is declared in the foo namespace??
    } 

}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-01-04 20:09:40

这完全取决于T的类型。

如果swap()的类型与自己的交换空间位于不同的名称空间中,则依赖于参数的查找将发现不同的T。否则,它将在当前命名空间中查找。

代码语言:javascript
复制
#include <utility>  //includes std::swap and std::move
#include <iostream>

namespace foo
{
    template<typename T>
    inline void swap(T& lhs, T& rhs) {
        std::cout << "foo swap\n";
    }
}
namespace foo
{
    template<typename T>
    void myfun(T a, T b)
    {
        a += b;
        swap(a, b);  // Looks for swap using the type T.
                     // If not found uses the current namespace.
                     // If not found uses the enclosing namespace.
    }

}

namespace baz
{
    class X {
        public:
        X& operator+=(X const& rhs){return *this;}
    };
    inline void swap(X& lhs, X& rhs) {
        std::cout << "Bazz Swap\n";
    }
}

int main()
{
    baz::X  a,b;
    foo::myfun(a,b);  // finds ::baz::swap()
}

结果:

代码语言:javascript
复制
> a.out
Bazz Swap
>
票数 4
EN

Stack Overflow用户

发布于 2016-01-04 19:55:43

它会叫foo::swap

如果您想使用std::swap(a, b);实现,可以使用std

票数 2
EN

Stack Overflow用户

发布于 2016-01-04 20:02:45

是的,当然。首先搜索当前命名空间以查找非限定名。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34598778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档