2012-01-21 50 views
12

可能重複:
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 

誰知道什麼是錯?

+1

郵政*確切*完全編譯錯誤。 – Nawaz

+0

[cc] .. \ obj \ main.o :(。rodata._ZTI8Accel_ad [Accel_ad的類型信息] + 0x8):未定義引用'typeinfo for Accel' [cc] collect2:ld返回1退出狀態 – SevenDays

+0

@wsevendays:請用確切的錯誤信息更新問題。一般而言,通過更新您的帖子來回應澄清請求,而不是回覆評論。首先,如果沒有閱讀評論,一個問題應該是可以理解的。另一方面,SO是一個質量保證和網站,而不是一個論壇,評論意圖不適合(也不適合)討論。 – outis

回答

40

必須要麼提供虛函數的定義在基類或者宣佈純:

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) {}; 
}; 
+0

我發現如果我註釋行「measure();」我的代碼編譯,但爲什麼我不能調用函數「measure();」從課堂本身? – SevenDays

+0

@wsevendays是衡量還是校準的問題? –

+0

在函數校準結束時,我調用了度量函數,但是我的代碼失敗了。 – SevenDays