ホームページ > バックエンド開発 > C++ > テンプレート化された C クラス実装を .hpp および .cpp ファイルに分割すると、未定義の参照が取得されるのはなぜですか?

テンプレート化された C クラス実装を .hpp および .cpp ファイルに分割すると、未定義の参照が取得されるのはなぜですか?

Barbara Streisand
リリース: 2024-12-28 05:48:15
オリジナル
789 人が閲覧しました

Why Do I Get Undefined References When Separating Templated C   Class Implementations into .hpp and .cpp Files?

テンプレート化された C クラスを .hpp/.cpp ファイルに分割する

問題:

コンパイルC テンプレート クラスが .hpp ファイルと .cpp ファイルに分割されると、未定義の参照エラーが発生しますテンプレートメンバー用関数.

コード:

stack.hpp:

template <typename Type>
class stack {
    public:
            stack();
            ~stack();
};
ログイン後にコピー

stack.cpp:

#include <iostream>
#include "stack.hpp"

template <typename Type> stack<Type>::stack() {
        std::cerr << "Hello, stack " << this << "!" << std::endl;
}

template <typename Type> stack<Type>::~stack() {
        std::cerr << "Goodbye, stack " << this << "." << std::endl;
}
ログイン後にコピー

main.cpp:

#include "stack.hpp"

int main() {
    stack<int> s;

    return 0;
}
ログイン後にコピー

答え:

説明:

それテンプレート化されたクラスの実装を個別の .cpp ファイルに分割してコンパイルすることは現実的ではありません。ヘッダー ファイルは前処理されるだけで、実際のコードは含まれません。

コンパイル プロセス:

コンパイル時に、前処理されたヘッダー コードは .cpp ファイルと結合されます。ただし、テンプレート クラスの場合、コンパイラはメモリ レイアウトとメソッド定義を生成するためにテンプレート データ型に関する情報を必要とします。

個別の cpp ファイルの問題:

メソッドの移動ヘッダー ファイルでテンプレート クラスをインスタンス化せずに別の cpp ファイルに定義しても、必要なオブジェクト ファイル情報は生成されません。したがって、リンカーはシンボルを見つけることができず、未定義の参照エラーが発生します。

代替アプローチ:

インターフェイスを実装から分離するには、データ構造をアルゴリズムから分離することを検討してください。テンプレート クラスはデータ構造のみを表す必要があります。アルゴリズムは、テンプレート クラスと対話したり、テンプレート クラスを利用したりする、テンプレート化されていない個別のクラス ライブラリに実装できます。このアプローチにより、貴重な実装の詳細を隠すことができます。

以上がテンプレート化された C クラス実装を .hpp および .cpp ファイルに分割すると、未定義の参照が取得されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート