オーバーロードされたtable::scan_index(std::string, ...)
メンバー関数を成功させずに呼び出そうとしています。わかりやすくするために、関連していないコードはすべて削除しました。メンバー関数のオーバーロード/テンプレートの特殊化問題
私はtable
という名前のクラスを持っています。このクラスは、文字列を特殊なケースとして扱うために、scan_index()
というオーバーロードされた/テンプレート化されたメンバ関数を持っています。
class table : boost::noncopyable
{
public:
template <typename T>
void scan_index(T val, std::function<bool (uint recno, T val)> callback) {
// code
}
void scan_index(std::string val, std::function<bool (uint recno, std::string val)> callback) {
// code
}
};
その後table::scan_index(T, ...)
class hitlist {
public:
template <typename T>
void eq(uint fieldno, T value) {
table* index_table = db.get_index_table(fieldno);
// code
index_table->scan_index<T>(value, [&](uint recno, T n)->bool {
// code
});
}
};
そして、それをすべてキックオフ最後に、コードを呼び出すテンプレートメンバ関数の数があるhitlist
クラスがあります:
hitlist hl;
// code
hl.eq<std::string>(*fieldno, p1.to_string());
は、問題は、table::scan_index(std::string, ...)
を呼び出す代わりに、テンプレート版を呼び出すことです。私は上記のようなオーバーロードと特殊な関数テンプレート(下記)の両方を使用しようとしましたが、何も動作していないようです。このコードを数時間眺めた後、私は何かが分からないように感じます。何か案は?
template <>
void scan_index<std::string>(std::string val, std::function<bool (uint recno, std::string val)> callback) {
// code
}
更新: 私はscan_index()
呼び出しから<T>
装飾を落としました。結果は、文字列パラメータで呼び出しがうまくコンパイルということでしたが、(ダブル例えば)他のタイプの呼び出しを、次のエラーが発生しました:
cannot convert parameter 1 from 'double' to 'std::string'
だから私は、バックテンプレートの特殊化を使用しに行きました。 ( 私は4つのオーバーロード関数をtable
クラスからテンプレートscan_index()
機能をドロップして簡単に書き込むことによって、この問題を修正:私はVC++ 10.0
ソリューションを使用しています:FYI
error C2784: 'void table::scan_index(T,std::tr1::function<bool(uint,T)>)' :
could not deduce template argument for 'std::tr1::function<bool(uint,T)>'
from '`anonymous-namespace'::<lambda5>'
:今、私はこのエラーを取得しますそのうちの3つは署名を除いて同一である)。幸いにも、彼らはすべてかなり短い(10行未満)ので、それほど悪くはありません。
あなたはKoenigの名前検索の問題を強く疑っています。 –
潜在的に関連しています:http://stackoverflow.com/questions/4217733/distance-calculation-error-in-c/4218731#4218731 –
私はここでこれに似た問題がありました:http://stackoverflow.com/questions/3406004テンプレート 'index_table-> scan_index ... –
Grammin