Я пытался вызвать перегруженную функцию-член 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
}
};
Тогда существует класс hitlist
, который имеет ряд шаблонных функций-членов, которые вызывают 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 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
}
Обновление:
Я уронил украшение <T>
из звонка scan_index()
. В результате вызовы со строковым параметром компилируются просто отлично, но вызовы с другими типами (например, double) приводят к следующей ошибке:
cannot convert parameter 1 from 'double' to 'std::string'
Итак, я вернулся к использованию шаблонной специализации. Теперь я получаю эту ошибку:
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>'
К вашему сведению: я использую VC ++ 10.0
Решение:
Я исправил эту проблему, убрав шаблонную функцию scan_index()
из класса table
и просто написав четыре перегруженные функции (три из которых идентичны, за исключением сигнатуры). К счастью, все они довольно короткие (менее десяти строк), так что все не так плохо.