通过 using 指令制作私有继承的内部模板 public
Making a private inherited inner template public via a using directive
我正在尝试使用 using
指令引入 public
派生 class 某些内部 class 模板的访问声明。代码:
template <typename T>
class Base
{
public:
template<typename U>
struct Inner;
};
template<typename T>
class Derived: private Base<T>
{
public:
using typename Base<T>::template Inner; // make it visible
Inner<T>* ptr; // no need for typename here, non-qualified name
};
int main() {}
g++ 和 clang++ 都不编译这段代码,都抱怨
error: expected unqualified-id before 'template'
据我所知,Inner
是一个从属模板名称,因此在限定其名称时应使用::template
,并且在前面还要使用typename
,因为Base<T>::Inner
是依赖类型。我已经尝试了所有可能的组合 with/without typename/template
和 none 编译。有什么方法可以在 Derived
的 public
部分使用 Inner
吗?
不可能。 using-declaration 来自 [namespace.udecl]:
using
typename
opt nested-name-specifier unqualified-id ;
但是 unqualified-id 不能是 class 模板。
您可以只创建一个别名:
template<typename T>
class Derived: private Base<T>
{
public:
template <typename U>
using Inner = typename Base<T>::template Inner<U>;
Inner<T>* ptr;
};
我正在尝试使用 using
指令引入 public
派生 class 某些内部 class 模板的访问声明。代码:
template <typename T>
class Base
{
public:
template<typename U>
struct Inner;
};
template<typename T>
class Derived: private Base<T>
{
public:
using typename Base<T>::template Inner; // make it visible
Inner<T>* ptr; // no need for typename here, non-qualified name
};
int main() {}
g++ 和 clang++ 都不编译这段代码,都抱怨
error: expected unqualified-id before 'template'
据我所知,Inner
是一个从属模板名称,因此在限定其名称时应使用::template
,并且在前面还要使用typename
,因为Base<T>::Inner
是依赖类型。我已经尝试了所有可能的组合 with/without typename/template
和 none 编译。有什么方法可以在 Derived
的 public
部分使用 Inner
吗?
不可能。 using-declaration 来自 [namespace.udecl]:
using
typename
opt nested-name-specifier unqualified-id ;
但是 unqualified-id 不能是 class 模板。
您可以只创建一个别名:
template<typename T>
class Derived: private Base<T>
{
public:
template <typename U>
using Inner = typename Base<T>::template Inner<U>;
Inner<T>* ptr;
};