ここ数時間私の脳を壊していますが、このコードを実行しようとしているときにエラーが発生する理由はまだ分かりません。 は、いくつかの時間後、私は式にそれを絞り込むために管理:1つのテンプレート関数に2つの異なるコンパレータを渡すことができないのはなぜですか?
問題が発生するpastryPrice()
- あなたが見ることができるように、私は
struct dialingAreaComp{
inline bool operator()(const Deliver *d1, const Deliver *d2)const {
return d1->getDialingArea() < d2->getDialingArea();
}
};
struct pastryPrice {
inline bool operator()(const Pastry *p1, const Pastry *p2)const {
return p1->getPrice() < p2->getPrice();
}
};
template<class T>
void sortCollection(T& collection)
{
if (typeid (collection) == typeid(vector <Deliver*>))
{
sort(collection.begin(), collection.end(), dialingAreaComp());
printCollection(collection);
}
else if (typeid (collection) == typeid(vector <Pastry*>))
{
sort(collection.begin(), collection.end(), pastryPrice());
printCollection(collection);
}
else { cout << "WRONG!"; }
}
仕分けの1つのテンプレート機能のための多数のコンパレータを構築しようとしています 私は5つのエラーを取得しています
、すべて同じ:
重大度コード説明プロジェクトファイルの行の抑制状態 エラーC2664「BOOLベーカリー:: pastryPrice ::演算子(const Pastry *、const pastry *)const ':引数1を' Deliver * 'から' const Pastry * 'に変換できません。ベーカリーc:\ program files(x86)\ microsoft visual studio 14.0 \ vc \ include \ xutility 809
そしてもう一つ:
重大度コード説明プロジェクトファイルの行の抑制状態 エラーC2056違法な表現ベーカリーC:\プログラムファイル(x86の)\マイクロソフトのVisual Studio 14.0 \ VCの\含める\ xutility 809
私が上記で書いた表現を外すと、コードはで正常に動作します - なぜ2つの異なるコンパレータを1つのテンプレート関数に渡すことができませんか?今
:
C2264は、1つの機能に互換性のないタイプのパラメータを渡すしようとしたときに発生するコンパイラエラーです。
しかし、Deliverコンパレータをオフにしたときに、Pastryも同様にコンパイルされました。互換性のないタイプは何ですか?
これは、テンプレートがコンパイル時に評価されるのに対し、 'if'文は実行時に評価されるからです。したがって、常に関数呼び出しの1つが一致しません。 –