在定义中使用 typedef 类型

Using typedef types in definition

我有一个class如下,

template<size_t N>
class A 
{
   typedef int(*ARRAY)[N];
   array getArray();

   ARRAY array;
};

那我如何在定义中使用类型ARRAY呢?我试过这个

template<size_t N>
ARRAY A<N>::getArray()
{
   return array;
}

但是,它告诉我 ARRAY 没有定义。

template<size_t N>
typename A<N>::ARRAY A<N>::getArray(){
    return array;
}

https://repl.it/repls/DecisiveFragrantFact

ARRAY 是依赖名称,因此您需要在 class 范围之外使用 typename keyword before 它。

template<size_t N>
typename A<N>::ARRAY A<N>::getArray()
//^^^^^^^^^^^^^
{
   return array;
}

或使用trailing return

template<size_t N>
auto A<N>::getArray() -> ARRAY
//                 ^^^^^^^^^^^^^
{
   return array;
}

此外,您的 class 成员声明中有错字。

array getArray();

应该是

ARRAY getArray();

但是,您有什么理由不想使用 std::array

问题在于您没有在命名空间中定义类型 ARRAY,而是在 class 模板的范围内。因此,非限定查找找不到该名称的类型。

除了使用限定名称来引用此成员类型别名(如 Bill Lynch 的 所示),另一种方法是使用尾随 return 类型,在这种情况下,将在其中查找名称class 的上下文:

template<size_t N>
auto A<N>::getArray() -> ARRAY {
    return array;
}

P.S。我强烈建议不要通过定义类型别名来混淆类型的指针性(或引用性),除非别名在泛型编程中使用,在这种情况下它可能被花哨的指针(或代理引用)替换。在这种情况下,别名通常应该被命名以表示它是一个“指针”(或“引用”),例如迭代器和分配器的类型别名及其在标准库中的类型特征。