在編寫C 程式碼時,有時會遇到「不允許本機類型作為模板參數」這樣的編譯錯誤。這通常表示我們在模板參數中使用了局部類型,如函數內部定義的類別或結構體類型。在此文章中,我們將討論這個問題以及如何解決它。
首先,讓我們來看看為什麼會出現這個編譯錯誤。在C 中,模板參數必須在編譯時被解析,而局部型別的定義是在執行時才會發生的。因此,局部類型不能用作模板參數,因為編譯器不知道如何解析它們。
舉一個例子來說明這個問題:
#include <iostream> template <typename T> void printSize(const T& arg){ struct localStruct { int i; }myLocalStruct; //定义了一个局部结构体类型 std::cout << "Size of arg = "<<sizeof(arg)<<" "; std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<" "; } int main() { int x = 5; printSize(x); return 0; }
在上面的程式碼中,我們定義了一個模板函數printSize,它接收一個參數arg。我們也定義了一個局部結構體類型myLocalStruct,並使用sizeof來取得它和參數arg的大小。
當我們編譯這個程式碼時,我們會得到一個錯誤訊息:「不允許本地類型作為模板參數」。
為了解決這個問題,我們需要將局部型別轉換為全域型別。我們可以將局部類型定義移動到函數外部,或將它定義為類別的成員類型。
讓我們看看如何使用全域類型來修復上面的程式碼:
#include <iostream> struct localStruct { int i; }; //将局部结构体类型定义为全局 template <typename T> void printSize(const T& arg){ localStruct myLocalStruct; std::cout << "Size of arg = "<<sizeof(arg)<<" "; std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<" "; } int main() { int x = 5; printSize(x); return 0; }
現在,我們將局部結構體定義移到了函數外部。這個修復方案可以成功編譯和運行,輸出結果也是正確的。
除了將局部型別轉換為全域型別之外,另一個解決方案是將局部型別定義為類別的成員型別。這個方法需要一些額外的程式碼,但有時更方便:
#include <iostream> template <typename T> class myClass{ public: struct localStruct { int i; }; void printSize(const T& arg){ localStruct myLocalStruct; std::cout << "Size of arg = "<<sizeof(arg)<<" "; std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<" "; } }; int main() { int x = 5; myClass<int> obj; obj.printSize(x); return 0; }
在上面的程式碼中,我們將局部結構體類型定義為myClass的成員類型。這個修復方案也可以成功編譯和運行,並輸出正確的結果。
總結一下,當我們在使用C 模板時遇到「不允許本地類型作為模板參數」的編譯錯誤時,我們需要將局部類型轉換為全域類型或類別的成員類型。這些修復方案都可以成功解決這個問題。
以上是C++編譯錯誤:不允許本機類型作為模板參數,怎麼處理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!