V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
chigco
V2EX  ›  问与答

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

  •  1
     
  •   chigco · 2018-04-24 12:18:22 +08:00 · 2581 次点击
    这是一个创建于 2387 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 天了。。。

    7 条回复    2018-04-26 17:32:35 +08:00
    Yiph
        1
    Yiph  
       2018-04-24 12:21:18 +08:00
    ArrayAlloter < 99, ClassA> m_arr; 在这里调用的地方,ClassA 的定义可见吗?
    chigco
        2
    chigco  
    OP
       2018-04-24 12:30:13 +08:00
    @Yiph 定义可见具体是?

    比如在 AAA.h 中调用。
    #include "ClassA.h"
    直接塞入的 class 的名称
    chigco
        3
    chigco  
    OP
       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
        4
    forestyuan  
       2018-04-24 14:51:47 +08:00
    估计问题出在虚函数上
    acros
        5
    acros  
       2018-04-24 15:05:12 +08:00
    ClassA 是怎么构造的?(构造函数?)
    换指针可以吗?
    yorTX9t
        6
    yorTX9t  
       2018-04-25 01:54:57 +08:00
    因为声明 Element m_element[ nArraySize ]; 的时候,Element 的大小必须是编译期常量,抽象类明显不符合要求。

    如果多态是必须的,数组也不想放弃,建议考虑下编译期多态,而不是运行期多态,也就是 CRTP。
    chigco
        7
    chigco  
    OP
       2018-04-26 17:32:35 +08:00
    @yorTX9t 那我申明的时候 Element m_element[ 99 ]; 这样呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5914 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:00 · PVG 10:00 · LAX 18:00 · JFK 21:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.