首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Linux GCC 編譯 C++ 模板函數聲明順序導致錯誤

     編輯:程式設計疑難解答

現象

Windows MSVC 編譯通過,Linux GCC 5.2 報錯:模板函數 `getReadOnlyData` 調用 `getData` 時提示未聲明。

原因

GCC **兩階段查找**:模板定義階段只查找**非依賴名稱**;`getData` 依賴模板參數 `T`,屬於**依賴名稱**,延遲到實例化階段查找。但實例化時若 `getData` 宣告在模板**之後**,GCC 找不到。

修正

將 `getData` 所有重載**聲明前置**於模板函數之前:

// 先聲明所有 getData 重載
PyObject * getData( const bool data );
PyObject * getData( const int data );
PyObject * getData( const uint data );
// ...

template <class T>
PyObject * getReadOnlyData( const T & d ) {
    return getData( d ); // 此處可見前置聲明
}

或在類內前置聲明(若為類成員),或使用 `this->getData(d)` 強制依賴查找(僅限成員函數)。

跨平台建議

**習慣先聲明後定義**,或在頭文件中將所有依賴名稱前置聲明,確保 GCC/Clang/MSVC 一致通過。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved