为什么我不能将类的类型成员作为模板参数传递?

时间:2015-07-02 09:23:58

标签: c++ c++11

我无法将类的类型成员作为模板参数传递。 例如,在以下代码中:

std::array<int, 1> a;
std::array<typename a::value_type, 1> a2;

不会编译。

这是什么原因?有解决方法吗?

2 个答案:

答案 0 :(得分:23)

a不是类型,因此您无法对其应用::。您可以使用decltype来检索a的类型:

std::array<int, 1> a;
std::array<decltype(a)::value_type, 1> a2;

答案 1 :(得分:1)

昆汀给了你一种方法来解决这个问题。还有两个。

当然,显而易见的解决方案是将对象a的名称替换为其类型名称:

std::array<typename std::array<int, 1>::value_type, 1> a2;

然而,看看你的代码,我想知道你想要的是定义 types 而不是对象。我认为aa2制作了非常糟糕的类型名称(所以我的怀疑可能是错误的),但是你走了:

typedef std::array<int, 1> a;
typedef std::array<typename a::value_type, 1> a2;

您现在可以创建这些类型的实例。