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 サイトの他の関連記事を参照してください。