【问题标题】:Using typedef types in definition在定义中使用 typedef 类型
【发布时间】:2020-11-16 22:49:18
【问题描述】:

我有一个类如下,

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 没有定义。

【问题讨论】:

  • @JesperJuhl:typedef int (*ARRAY)[N];
  • @BillLynch 被命名为 A&lt;N&gt;::ARRAY,正如您从您的回复中所知道的那样。
  • @Blindy:说他们没有定义ARRAY 感觉有点小气,如果真正的意思是你没有为ARRAY 提供正确的范围访问器。
  • ARRAY A&lt;N&gt;::getArray() 在您说函数是A&lt;N&gt; 的成员之前,您希望编译器如何知道ARRAY 的定义位置?它只是从左到右读取。您可以使用尾随返回类型来避免重复:auto A&lt;N&gt;::getArray() -&gt; ARRAY。但请不要将ALL_CAPS 用于除宏之外的任何内容,也不要使用宏。

标签: c++ arrays c++11 templates class-template


【解决方案1】:

ARRAY 是依赖名称,因此您需要在类范围之外使用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;
}

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

array getArray();

应该是

ARRAY getArray();

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:
      template<size_t N>
      typename A<N>::ARRAY A<N>::getArray(){
          return array;
      }
      

      https://repl.it/repls/DecisiveFragrantFact

      【讨论】:

      • 或者,auto A&lt;N&gt;::getArray() -&gt; ARRAY 也可以,而且噪音小一些
      猜你喜欢
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2011-11-15
      相关资源
      最近更新 更多