gpt4 book ai didi

c++ - 成员函数重载/模板特化问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:35 24 4
gpt4 key购买 nike

我一直在尝试调用重载的 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 的功能类并简单地编写四个重载函数(其中三个除了签名外是相同的)。幸运的是,它们都很短(不到 10 行),所以还算不错。

最佳答案

您在此处显式调用模板化成员:

index_table->scan_index<T>(value, [&](uint recno, T n)...

由于 value 是模板参数,您应该可以将其替换为:

index_table->scan_index(value, [&](uint recno, T n)...

关于c++ - 成员函数重载/模板特化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4607989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com