ホームページ >バックエンド開発 >C++ >テンプレート化された C クラスを .hpp および .cpp ファイルに分割できますか?

テンプレート化された C クラスを .hpp および .cpp ファイルに分割できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-22 05:49:08925ブラウズ

Can Templated C   Classes Be Split into .hpp and .cpp Files?

テンプレート化された C クラスを .hpp/.cpp ファイルに分割することは可能ですか?

問題:

テンプレート化された C クラスを .hpp に分割しようとしていますおよび .cpp ファイルでは、コンストラクターとデストラクターへの未定義の参照が原因でコンパイル エラーが発生しますシンボル。

main.cpp:(.text+0xe): undefined reference to 'stack<int>::stack()'
main.cpp:(.text+0x1c): undefined reference to 'stack<int>::~stack()'

コード:

stack.hpp

#ifndef _STACK_HPP
#define _STACK_HPP

template <typename Type>
class stack {
    public:
            stack();
            ~stack();
};
#endif

st ack.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 ファイルに実装してコンパイルすることは現実的ではありません。コンパイラはテンプレート クラスのメモリ レイアウトとメソッド定義を生成するときにデータ型の知識を必要とするため、実装は .hpp ファイルに含める必要があります。 .cpp ファイルを個別にコンパイルしようとすると、次の問題が発生します。

  • オブジェクト ファイルはクラス情報を使用して生成されません。
  • リンカーは次のシンボルを見つけられません。オブジェクト ファイルが存在しない場合、ビルドは失敗します。

代替案解決策:

実装の詳細を非表示にするには、データ構造とアルゴリズムを分離することを検討してください。テンプレート化されたクラスを作成してデータ構造を表現し、テンプレート化されていないクラスはアルゴリズムを処理してデータ構造を利用します。これにより、テンプレート クラスに依存せずに、重要な実装の詳細を別のライブラリに隠すことができます。

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

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