c++ - 如何在类声明范围内使用 `using space::function`?

标签 c++ c++03 using-declaration

我想使用 using 声明在特定函数查找上启用 ADL,以便我可以在构造函数初始化列表中使用它。

代码如下:

template< typename T >
struct RefWrapper
{
    RefWrapper(T& t)
    : w(t)
    {}

    T& w;
};

struct Val
{
    Val(RefWrapper<Val> rw)
    {/*...*/}
};

namespace X
{
    template< typename T >
    RefWrapper<T> MakeWrap(T& t)
    { return RefWrapper<T>(t); }
}

namespace Y
{
    using X::MakeWrap;  // god no !
    struct C
    {
        //using X::MakeWrap;  // I want it here
        //                     error: using-declaration for non-member at class scope

        C(Val& value) : member(MakeWrap(value))
        {}

        Val member;
    };
}

相关:
How narrow should a using declaration be?
在这个问题的唯一答案中,(4)是不可能的,但它是我想要的地方!

最佳答案

很遗憾,您不能那样做。

N4527::7.3.3$3,using 声明,[namespace.udecl]:

In a using-declaration used as a member-declaration, the nested-name-specifier shall name a base class of the class being defined.

当然,您可以像这样显式指定嵌套名称说明符:

C(Val& value) : member(X::MakeWrap(value))

或者作为解决方法,您可以使用本地包装函数,如下所示:

struct C
{
    //using X::MakeWrap;  // I want it here
    //                     error: using-declaration for non-member at class scope

    C(Val& value) : member(MakeWrap(value))
    {}

    Val member;
private:
    template< typename T >
    T MakeWrap(T& t) { return X::MakeWrap(t); }

};

关于c++ - 如何在类声明范围内使用 `using space::function`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31396895/

相关文章:

c++ - 在保持顺序的同时从 vector 中删除重复的成员

c++ - 是 int & foo();一个左值?

c++ - 指数为整数时pow(x,p)更快吗?

c++ - 如何 typedef 绑定(bind)成员方法,然后将该类型用作模板参数?

c++ - 您可以使用 using 将基类中的公共(public)成员重新声明为派生类中的私有(private)成员吗?

c++ - 是否可以使用自定义图形引擎渲染 Qt QWidgets 和 QML?

c++ - 一个 webview 如何填满整个页面?

c++ - 从最多 X 个字符构造 std::string,在空字符处停止

c++ - gets() 不允许先执行法院

c++ - 为什么(不相关的)using 声明可以通过参数依赖查找调和重载歧义?