【问题标题】:allocation of incomplete type 'T' c++分配不完整类型'T'c ++
【发布时间】:2018-09-03 10:44:30
【问题描述】:

我正在使用原始指针在 C++ 中实现一个动态数组。我是使用模板的新手。为了练习,我决定将课程分成两个 .hpp 和 .cpp 文件。初始化 T 数组时,我在源文件中收到以下编译错误:

“不完整类型'T'的分配”

这是头文件:

template <class T>
class DynArray {

public:
    DynArray(); //default constructor
private:
    T * array; //internal array
    int memsize; //number of allocated memory slots
    int t_size; //number of occupied memory slots
};

这里是源文件:

template <>
DynArray<class T>::DynArray() {
    memsize = 2;
    t_size = 0;
    array = new T[memsize];

}

我不喜欢我在源文件中所做的事情。我基本上按照我的 IDE (xcode) 告诉我的去做,但是在这里创建一个专门的模板感觉有些不对劲。这样做的正确方法是什么?

【问题讨论】:

  • 将构造函数内容移动到头部。源文件中的模板类型声明并不能真正“正常工作”。
  • 一切都是正确的,除了它需要移动到标题。嗯,大部分是正确的。您还需要将template &lt;&gt; DynArray&lt;class T&gt;::DynArray() 更改为template &lt;class T&gt; DynArray&lt;T&gt;::DynArray()

标签: c++ templates


【解决方案1】:

请将此作为起点Why can templates only be implemented in the header file?

关于错误不完整类型'T'的分配。请仔细看代码

template <>
DynArray<class T>::DynArray()

template 没有引入类型T。第二行介绍了class T 类型,在那里第一次提到。你可能知道没有templateclass T 是一个前向声明并且是一个不完整的类型,它的大小是未知的,new 不能分配未知大小的内存。正确的模板类成员应该这样声明

template <class T>
DynArray<T>::DynArray()

语法上是正确的,但实际上并不正确,请阅读上面提到的文章。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2011-07-13
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2012-11-18
    相关资源
    最近更新 更多