2

An Idiot's Guide to C++ Templates - Part 2という記事を読んでいて、宣言と実装の分離の部分にたどり着きました。

現在、次のような内容の 3 つのファイルがあります。

サンプル.hpp

#ifndef SAMPLE_HPP
#define SAMPLE_HPP

template <typename T>
void displayValue(T tValue);

#include "sample.cpp"

#endif

サンプル.cpp

#include <iostream>
template <typename T>
void displayValue(T tValue){
  std::cout<<tValue<<std::endl;
}

main.cpp

#include "sample.hpp"
int main(void) {
  displayValue(20);
  displayValue(3.14);
  return 0;
}

著者によると、

あなたのプロジェクト/ビルドは、コンパイルプロセスのためにSample.CPPを追加してはなりません

しかし、代わりに、私が使用するとき:

g++ main.cpp sample.cpp -o main

それはまだ動作します!

そのような場合、オブジェクトにはテンプレート関数に関するコードsample.oまだ含まれておらず、オブジェクトには含まれていると思います。したがって、理論的にはエラーはありません。しかし、なぜ著者は言ったのですか?displayValuemain.omust not

4

2 に答える 2

1

エラーが発生しないのは正常です。定義と実装が 1 つのファイルと見なされるためです。

より良い通常の C++ スタイルは次のとおりです。

ヘッダー ファイル (myClass.h): 実装ファイルを含めないでください (存在する場合、コンパイラはそれを見つけます)。実装 (myClass.cpp): #include myClass.h

メインプログラム (main.cpp) #include myClass.hも必要

この通常のスタイルを使用して実装すると、テンプレート関数/クラスの定義と実装を分離してはならないという理由だけで、リンケージ エラーが発生することが予想されます。

著者はこれを参照している可能性があります。

于 2013-06-30T06:00:15.633 に答える