【问题标题】:How to define a template class function with nested type of the template argument in its signature outside the class如何在类外的签名中定义模板参数的嵌套类型的模板类函数
【发布时间】:2015-04-07 13:40:45
【问题描述】:

我有一个模板类,它要求它的模板参数具有嵌套类型。它在其成员函数签名中使用这些类型。我找到了以下解决方案来声明成员函数:

template <class ElementType>
class AKL_API AklMemoryPool
{
public:
    typedef typename ElementType::DataType DataType;
    typedef typename ElementType::RetrieveType RetrieveType;
...
    RetrieveType Retrieve(unsigned int offset) const;
    DataType* EstablishCUDA();
    DataType* WriteToCUDA();
    DataType* ReadFromCUDA();
    DataType* GetCUDA();
...
};

但我只能在类声明中定义函数。 如果我尝试在外部定义它:

template <class ElementType>
AklMemoryPool<ElementType>::RetrieveType AklMemoryPool<ElementType>::Retrieve(unsigned int offset) const
{
...
}

我得到编译错误。

这就是问题所在,因为如果从某些地方可见,我需要隐藏实现,因为它会产生编译错误。我仅将 AklMemoryPool 类用作基类,因此我决定将实现移至 cpp 文件并将其包含在继承类的 cpp 文件中。

所以这里有一个问题: 如何在类外定义这些函数?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    你必须使用typename

    template <class ElementType>
    typename AklMemoryPool<ElementType>::RetrieveType
    AklMemoryPool<ElementType>::Retrieve(unsigned int offset) const
    {
    ...
    }
    

    或在正确上下文中使用类型(C++11 起)

    template <class ElementType>
    auto
    AklMemoryPool<ElementType>::Retrieve(unsigned int offset) const
    -> RetrieveType
    {
    ...
    }
    

    【讨论】:

    • 我忘了 C++11 的东西 :D +1
    【解决方案2】:

    你必须在AklMemoryPool&lt;ElementType&gt;::RetrieveType之前使用typename关键字,像这样:

    template <class ElementType>
    typename AklMemoryPool<ElementType>::RetrieveType AklMemoryPool<ElementType>::Retrieve(unsigned int offset) const
    {
        //...
    }
    

    你会看到它是如何编译的here

    【讨论】:

      【解决方案3】:

      你需要typename:

      template <class ElementType>
      typename AklMemoryPool<ElementType>::RetrieveType
      ^^^^^^^^
      AklMemoryPool<ElementType>::Retrieve(unsigned int offset) const
      {
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-08
        • 1970-01-01
        • 2018-11-26
        • 1970-01-01
        • 1970-01-01
        • 2020-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多