我有一个类,它将size类型作为参数,以防一个人不想使用size_t或另一个需要转换和检查溢出的硬编码类型。 该类还有一些方法采用第二种模板类型:
template< typename SizeType = uint32_t >
class BufferReader
{
SizeType m_nPosition;
template< typename T >
T Read();
}
我的问题是,实现这个的语法是什么?
template< typename SizeType, typename T >
T BufferReader< SizeType >::Read()
{
// ...
}
这给了我一个错误:
invalid use of incomplete type 'class core::BufferReader<SizeType>'
或者:
template< typename T >
template< typename SizeType >
T BufferReader< SizeType >::Read()
{
// ...
}
出现同样的错误。
还是其他什么?
谢谢!
答案 0 :(得分:4)
你的第二个例子几乎是正确的,你只需要先获得类的模板参数和第二个函数的模板参数:
template< typename SizeType >
template< typename T >
T BufferReader< SizeType >::Read()
{
// ...
}
答案 1 :(得分:3)
你几乎得到了它。您必须在声明中堆叠template
s:首先是类,然后是成员。
template < typename SizeT >
template < typename T >
T
BufferReader<SizeT>::Read()
{
return T {};
}
请注意,可以通过在类体中定义函数来简化代码,但我理解为了美学原因,有些人更愿意将声明与定义分开。