如何定义一个模板类函数,该函数在类外的签名中具有嵌套类型的模板参数

How to define a template class function with nested type of the template argument in its signature outside the class

本文关键字:嵌套类型 参数 定义 何定义 一个 类函数 函数      更新时间:2023-10-16

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

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文件内。

因此,这里有一个问题:如何在类外定义这些函数?

您必须使用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
{
...
}

您必须在AklMemoryPool<ElementType>::RetrieveType之前使用typename关键字,如下所示:

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

你可以在这里看到它是如何编译的。

您需要typename:

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