[解決済み] テンプレートクラスの前方宣言時に「未定義のテンプレートの暗黙のインスタンス化」が発生する。
2022-01-28 06:26:38
質問
私はテンプレートクラスを前方宣言する必要があるいくつかのコードを持っています(または、少なくとも、前方宣言は私にとって物事をはるかに容易にする...)。私が抱えている問題の簡易版を書きましたので、ここに表示することができます。
template<bool>
class MyTemplateClass;
int main( int argc, char* argv[] )
{
MyTemplateClass<false> myTemp; // error here
myTemp.GetTheValue();
return 0;
}
template<bool bShouldMult>
class MyTemplateClass
{
int m_myint;
float m_myfloat;
public:
MyTemplateClass() : m_myint(5), m_myfloat(3.0f) {}
float GetTheValue()
{
return m_myint * (bShouldMult ? m_myfloat : 1.0f);
}
};
コメントされた行で出ているエラーは
Error - implicit instantiation of undefined template 'MyTemplateClass<false>'
MyTemplateClassの前方宣言には、他にどのような詳細を含める必要があるのでしょうか?エラーは次の行から来ないので、私はそれがメソッドが未定義であるという事実のためではないと仮定しています。使用しているコンパイラはLLVM/CLangで、Macでコンパイルしています。
どのように解決するのですか?
テンプレートであろうとなかろうと、任意の型の変数を宣言するためには、その型の定義全体が利用可能でなければなりません。テンプレートを前方に宣言して、あたかもそれが定義されているかのように使い始めることはできません。その時点でできることは、テンプレートに基づく型のオブジェクトへのポインタを、このように宣言することだけです。
MyTemplateClass<false> *myTempPtr; // No error here
残念ながら(予想通りではありますが)、これでエラーは次の行に移動しました。このポインタの初期化という問題は残っています。
new MyTemplateClass<false>
というエラーが表示されます。
テンプレートの定義を使用する場所より先に移動するように、コードを整理し直す必要があります。コンパイラは、テンプレートのインスタンス化とそのメソッドの呼び出しを開始する時点で、定義全体を把握する必要があるのです。
関連
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み] フォワード宣言はどのような場合に使用できますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む