ホームページ  >  記事  >  バックエンド開発  >  C++ コンパイル エラー: ローカル型はテンプレート パラメーターとして許可されていません。どのように対処すればよいですか?

C++ コンパイル エラー: ローカル型はテンプレート パラメーターとして許可されていません。どのように対処すればよいですか?

PHPz
PHPzオリジナル
2023-08-21 21:39:221454ブラウズ

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;
}

上記のコードでは、パラメーター arg を受け取るテンプレート関数 printSize を定義します。また、ローカル構造体タイプ 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。