gpt4 book ai didi

c++ - 在命名空间中使用来自全局命名空间的函数

转载 作者:行者123 更新时间:2023-12-01 14:48:45 24 4
gpt4 key购买 nike

我正在使用一个命名空间下的库,我们称之为 Hello。

namespace Hello {

template<class T>
void World(std::ostream& os, const T& t) {
os << t;
}

}
class T类似于 std::array<int,10>我还为它编写了一个 ostream 重载函数。但是,调用 Hello::World(arr)导致编译错误,说编译器找不到 operator<<() 的重载.

经过一番搜索,我想出了一个解决方案来解释这种情况。
How does the operator overload resolution work within namespaces?Name resolution of functions inside templates instantiated with qualified types .

所以我们可以把情况简化成这样。
void f(int) {}
void f(int,int) {}

namespace Hello {
using ::f;
void f(int,int,int) {}
void World()
{
f(100);
f(100, 200);
f(100, 200, 300);
}
};

int main()
{
Hello::World();
return 0;
}

没有 using ::f;行,此代码无法编译,因为名称 f可以隐藏 所有功能 在全局命名空间中具有相同的名称。

现在这是我的问题:
  • namespace Hello { .... }在图书馆里,我不会修改它。也就是说,我不能修改 World() 里面的实现.唯一的解决办法是放一行 namespace Hello { using ::f; }在我的代码中的某个地方。这是一个很好的做法,还是有更优雅的解决方案?
  • 在这个例子中,我可以只导入 f(int)而不是 f(int,int) ?
  • 最佳答案

    Is it a good practice, or there is a more elegant solution?



    恕我直言,您可以将它与第三方库一起使用。它足够清晰和富有表现力。如果你能写出来就更好了:

    void World() {
    ::f(100); // f from global namespace
    ::f(100, 200); // f from global namespace
    f(100, 200, 300); // f NOT from global namespace
    }

    因为这样就可以清楚地看到哪个函数 其中 不是 来自全局命名空间,但此解决方案对您不起作用,因为您无法修改 World 的实现功能。

    Can I only import f(int) and not f(int, int)?



    是的。您可以执行以下操作以仅导入 f(int)功能:

    void f(int) {}

    namespace Hello {
    using ::f; // only void f(int) is defined before this line
    // therefore, it is the only overload being imported to the Hello namespace
    }

    void f(int,int) {}

    Demo

    更新

    如果您只想导入 operator<< 的一个重载, 不是一个普通的函数,那么你可以将每个重载包装在一个单独的命名空间中,如下所示:

    namespace XX {

    struct X {
    int x;
    };

    std::ostream& operator<<(std::ostream& os, X const& x) {
    return os;
    }

    }

    namespace YY {

    std::ostream& operator<<(std::ostream& os, Y const& y) {
    return os;
    }

    struct Y {
    double y;
    };

    }

    namespace Hello {
    using ::XX::X;
    using ::XX::operator<<;
    using ::YY::Y;
    }

    看看 live .

    关于c++ - 在命名空间中使用来自全局命名空间的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60246803/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com