我有一个模板类,需要从其模板参数中获得嵌套类型。它在其成员函数签名中使用这些类型。我找到了以下解决方案来声明成员函数:
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文件中。
所以这是一个问题: 如何在课外定义这些功能?
答案 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
{
...
}