首頁  >  文章  >  後端開發  >  C++編譯錯誤:不允許本機類型作為模板參數,怎麼處理?

C++編譯錯誤:不允許本機類型作為模板參數,怎麼處理?

PHPz
PHPz原創
2023-08-21 21:39:221536瀏覽

在編寫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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn