C ++:初始化头文件中声明的模板构造函数/例程?

时间:2011-10-21 22:18:31

标签: c++ c templates header

我在头文件中定义了一个模板,如下所示:

 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â

3 个答案:

答案 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所述。