C++のtemplate関数/クラスはtemplate外から利用された時にはじめて実体化されます。
そのせいもあって、宣言と実装をわけるのは大変です。
今回は、ラムダ式の型が翻訳単位に縛られているせいで、テンプレート関数へ渡せる型にならない事が問題となっています。
対処方法としては
つまりはsearch_algorithms.h
にsearch_algorithms.cpp
の内容を書いてしまう。
- templateではなく
std::function
を用いる。
c++
1namespace my {
2using Predicate = std::function<bool(int)>;
3using Compare = std::function<int(int)>;
4Iterator SequentialSearch(Iterator begin, Iterator end, const Predicate& pred);
5Iterator BinarySearch(Iterator begin, Iterator end, const Compare& comp);
6}
main.cpp
側のテンプレートに渡しているラムダ式をすべてstd::function([&target](const int &cur) { return cur == target; })
のように変換し
search_algorithms.cpp
に
c++
1template Iterator SequentialSearch(Iterator begin, Iterator end, std::function<bool(const int&)> pred);
2template Iterator BinarySearch(Iterator begin, Iterator end, std::function<int(const int&)> comp);
を記述しておく
テンプレート関数としての利点がなくなりますし、ヘッダにテンプレート関数の実装を書くのが一番いいように思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。