如何在 class 声明范围内使用 `using space::function`?
How to use `using space::function` in class declaration scope?
我想使用 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); }
};
我想使用 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); }
};