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
まだ含まれておらず、オブジェクトには含まれていると思います。したがって、理論的にはエラーはありません。しかし、なぜ著者は言ったのですか?displayValue
main.o
must not