如何在类外部的签名中定义模板类参数的嵌套类型的模板类函数

时间:2015-04-07 13:40:45

标签: c++ templates

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

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

所以这是一个问题: 如何在课外定义这些功能?

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

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

你可以看到这是如何编译的here

答案 2 :(得分:2)

您需要typename

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