2

我想使用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;
    };
}

相关:
using 声明应该有多窄?
在这个问题的独特答案中,(4)是不可能的,但这是我想要的地方!

4

1 回答 1

1

不幸的是,你不能这样做。

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

在用作成员声明的 using-declaration 中,nested-name-specifier 应命名正在定义的类的基类。

当然,您可以显式指定嵌套名称说明符,例如:

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

};
于 2015-07-14T03:20:39.500 回答