V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
chigco
V2EX  ›  问与答

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

  •  1
     
  •   chigco · Apr 24, 2018 · 3437 views
    This topic created in 2934 days ago, the information mentioned may be changed or developed.

    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 replies    2018-04-26 17:32:35 +08:00
    Yiph
        1
    Yiph  
       Apr 24, 2018
    ArrayAlloter < 99, ClassA> m_arr; 在这里调用的地方,ClassA 的定义可见吗?
    chigco
        2
    chigco  
    OP
       Apr 24, 2018
    @Yiph 定义可见具体是?

    比如在 AAA.h 中调用。
    #include "ClassA.h"
    直接塞入的 class 的名称
    chigco
        3
    chigco  
    OP
       Apr 24, 2018
    2. 调用在 AAA.h 中
    #include "ClassA.h"

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

    这边就报错了。

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

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

    如果多态是必须的,数组也不想放弃,建议考虑下编译期多态,而不是运行期多态,也就是 CRTP。
    chigco
        7
    chigco  
    OP
       Apr 26, 2018
    @yorTX9t 那我申明的时候 Element m_element[ 99 ]; 这样呢?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4620 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 00:13 · PVG 08:13 · LAX 17:13 · JFK 20:13
    ♥ Do have faith in what you're doing.