【问题标题】:undefined reference to `typeinfo for class' [duplicate]未定义对“类的类型信息”的引用 [重复]
【发布时间】:2012-02-15 15:16:56
【问题描述】:

可能重复:
g++ undefined reference to typeinfo
Undefined symbols “vtable for …” and “typeinfo for…”?

我无法使用我的课程。

class Accel {
public:
    virtual void initialize(void);
    virtual void measure(void);
    virtual void calibrate(void);
    virtual const int getFlightData(byte);
};
class Accel_ad : public Accel {
public:
    Accel_ad() : Accel(){}
    void initialize(void) {/*code code code...*/}
    void measure(void) {/*measure code*/}
    const int getFlightData(byte axis){/*getting data*/}
    void calibrate(void) {
        int findZero[FINDZERO];
        int dataAddress;
        uint8_t  data[2];
        for (byte calAxis = XAXIS; calAxis < ZAXIS; calAxis++) {
            if (calAxis == YAXIS) dataAddress = 0x32;
            if (calAxis == XAXIS) dataAddress = 0x34;
            if (calAxis == ZAXIS) dataAddress = 0x36;
            for (byte i=0; i<FINDZERO; i++) {
                readReverseWordI2C(dataAddress,data);
                findZero[i] = (data[1] << 8) | (data[0]);;
                Delay_ms(10);
            }
            accelZero[calAxis] = findMedian(findZero, FINDZERO);
        }

        // replace with estimated Z axis 0g value
        accelZero[ZAXIS] = (accelZero[XAXIS] + accelZero[PITCH]) / 2;
        // store accel value that represents 1g
        measure();
        accelOneG = -accelData[ZAXIS];
    }

main.cpp

Accel_ad accel;//all ok
accel.initialize();//all ok
accel.calibrate();//ERROR: undefined reference to `typeinfo for Accel'
accel.measure();//All okey

谁知道怎么了?

我得到的整个错误是:

.\obj\main.o:(.rodata._ZTI8Accel_ad[typeinfo for Accel_ad]+0x8): undefined reference to `typeinfo for Accel' [cc] collect2: ld returned 1 exit status

【问题讨论】:

  • 发布 exact 完整编译错误。
  • [cc] ..\obj\main.o:(.rodata._ZTI8Accel_ad[typeinfo for Accel_ad]+0x8): undefined reference to `typeinfo for Accel' [cc] collect2: ld returned 1退出状态
  • @wsevendays:请使用确切的错误消息更新问题。通常,通过更新您的帖子而不是回复评论来回应澄清请求。一方面,一个问题应该是可以理解的,无需阅读 cmets。另一方面,SO 是一个 QA 和网站,而不是一个论坛,并且 cmets 不适合(也不适合)讨论。

标签: c++ g++ linker-errors virtual typeinfo


【解决方案1】:

您必须在基类中提供虚函数的定义或将它们声明为纯函数:

class Accel {
public:
   virtual void initialize(void) = 0;        //either pure virtual
   virtual void measure(void) = 0; 
   virtual void calibrate(void) {};          //or implementation 
   virtual const int getFlightData(byte) {};
};

【讨论】:

  • 我发现如果我注释行“measure();”我的代码可以编译,但为什么我不能调用函数“measure();”来自班级本身?
  • @wsevendays 是测量还是校准的问题?
  • 在函数校准结束时我调用了测量函数,但我的代码失败了。
  • @wsevendays 你试过我在回答中写的吗?
  • hmm..你答对了,但你所说的“virtual void initialize(void) = 0;”是什么意思?
猜你喜欢
  • 2013-05-03
  • 2015-09-24
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2018-09-24
相关资源
最近更新 更多