c++ 提示 “ 数组元素类型不能是函数或抽象类类型 ”

2018-04-24 12:18:22 +08:00
 chigco

1. 定义一个模板类

template< int nArraySize , class Element >
class ArrayAlloter {
public :
....
private :
    Element		m_element[ nArraySize ];
    ...
}

2. 调用

ArrayAlloter < 99, ClassA> m_arr;

这边就报错了。

“ m_element ”数组元素类型不能是函数或抽象类类型

3. ClassA 看了下所有的 virtual 都实现了呀。

class ClassA : public ClassBase {
....
}

然后 ClassBase: 其他 struct1,struct2

4. 项目从 vc6 升到 vs2017 的。vc6 貌似没这个问题。

卡了 2 天了。。。

2640 次点击
所在节点    问与答
7 条回复
Yiph
2018-04-24 12:21:18 +08:00
ArrayAlloter < 99, ClassA> m_arr; 在这里调用的地方,ClassA 的定义可见吗?
chigco
2018-04-24 12:30:13 +08:00
@Yiph 定义可见具体是?

比如在 AAA.h 中调用。
#include "ClassA.h"
直接塞入的 class 的名称
chigco
2018-04-24 12:32:36 +08:00
2. 调用在 AAA.h 中
#include "ClassA.h"

class AAA {
private:
ArrayAlloter < 99, ClassA> m_arr;
}

这边就报错了。

“ m_element ”数组元素类型不能是函数或抽象类类型

note: 参见对正在编译的 类 模板 实例化 "ArrayAlloter < 99, ClassA>" 的引用
forestyuan
2018-04-24 14:51:47 +08:00
估计问题出在虚函数上
acros
2018-04-24 15:05:12 +08:00
ClassA 是怎么构造的?(构造函数?)
换指针可以吗?
yorTX9t
2018-04-25 01:54:57 +08:00
因为声明 Element m_element[ nArraySize ]; 的时候,Element 的大小必须是编译期常量,抽象类明显不符合要求。

如果多态是必须的,数组也不想放弃,建议考虑下编译期多态,而不是运行期多态,也就是 CRTP。
chigco
2018-04-26 17:32:35 +08:00
@yorTX9t 那我申明的时候 Element m_element[ 99 ]; 这样呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/449393

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX