我在头文件中定义了一个模板,如下所示:
template<typename T> class BoundedBuffer {
unsigned int size;
T entries[];
public:
BoundedBuffer( const unsigned int size = 10 );
void insert( T elem );
T remove();
};
但是,当我尝试初始化构造函数时:
BoundedBuffer<T>::BoundedBuffer( const unsigned int size = 10 ) size(size) {
// create array of entries
entries = new T[size];
// initialize all entries to null
for(int i = 0; i < size; i++)
entries[i] = null;
}
我收到以下错误(前一个代码块的第一行是17):
q1buffer.cc:17: error: âTâ was not declared in this scope
q1buffer.cc:17: error: template argument 1 is invalid
q1buffer.cc:17: error: expected initializer before âsizeâ
答案 0 :(得分:4)
正确的语法是:
template <typename T>
BoundedBuffer<T>::BoundedBuffer(const unsigned int size) : size(size) {
// create array of entries
entries = new T[size];
// initialize all entries to null
for(int i = 0; i < size; i++)
entries[i] = null;
}
请注意,可选参数不应在函数定义中声明,而应在函数声明中声明。
class aaa
{
// declaration
void xxx(int w = 10);
};
// definition
void aaa::xxx(int w)
{
...
}
请注意,模板化类的所有内容都应保留在H文件中。
“它们必须位于相同的转换单元中。在某些库中将模板实现分离为.tpp(或其他扩展名)文件是很常见的,然后将该文件包含在声明模板的.h中。 “正如Michael Price所说。
模板不是普通类型,无法链接。 它们仅在被请求时被实例化。
请注意,构造函数字段初始值设定项需要“:”字符。
class MyClass
{
public:
int x;
MyClass() : x(10) { /* note that i used : character */ }
};
答案 1 :(得分:1)
您必须在标头中实现模板的所有方法,因为模板的用户需要能够看到这些方法为给定类型实例化它。
答案 2 :(得分:1)
您的声明应该是:
template< typename T >
BoundedBuffer<T>::BoundedBuffer( const unsigned int size ) : size( size ) {...}
请注意,它也必须位于头文件中,如@Dean Povey所述。