【问题标题】:How to use `using space::function` in class declaration scope?如何在类声明范围内使用`using space::function`?
【发布时间】:2015-10-02 12:22:52
【问题描述】:

我想使用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?
在this question's unique's answer中,(4)是不可能的,但这是我想要的地方!

【问题讨论】:

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


    【解决方案1】:

    很遗憾,你不能这样做。

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

    在用作成员声明的 using 声明中, 嵌套名称说明符应命名该类的基类 已定义。

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

    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); }
    
    };
    

    【讨论】:

    • 该死,我的问题根本不会引起任何好奇心。好吧,我希望这种情况可以有一些解决方法。
    • @v.oddou 作为一种解决方法,您可以使用本地包装函数。我已将其添加到我的答案中。
    • 确实,本地包装器可能是一个合理的解决方法。好主意。除此之外,没有机会获得更直接的 C+11 好东西?因为这个函数很好,但它有 2 个缺点,1 是冗长的,2 是关于参数完美转发和返回值复制省略的平均保证。
    • @v.oddou 基本上,包装函数是inline 函数,第二个问题应该没问题。冗长……是的,是的。
    猜你喜欢
    • 2020-06-08
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多