我定义了以下功能:
template<class KEY, class VALUE, class HASH_FUNCTION,
class COMPARATOR_FUNCTION, class GREATER_THAN_FUNCTION>
bool Test3(size_t szCount, double dLoadFactor, vector<KEY>& vVals,
const HASH_FUNCTION& hf, const COMPARATOR_FUNCTION& cf,
const GREATER_THAN_FUNCTION& gf)
然后我在main()
中调用它。
int main()
{
vector<char*> vVals = GetWords("enwik8", 128*1024*1024);
SHash sh;
SHComp cf;
SHGreater gf;
Test3(1000, 0.7f, vVals, sh, cf, gf);
return 0;
}
我发现这个错误:
/home/duminda/main.cpp:313: error: no matching function for call to
‘Test3(int, float, std::vector<char*, std::allocator<char*> >&, SHash&,
SHComp&, SHGreater&)’
我可能错过了一些明显的东西。任何帮助,将不胜感激。感谢。
答案 0 :(得分:3)
查看函数声明,它有一个模板参数V
,它不会在实际参数列表中的任何位置使用。因此无法在呼叫站点自动推断出来。
尝试将其定义为:
template<class K class HF, class CF, class GF>
bool Test3(size_t szCount, double dLoadFactor, vector<K>& vVals, const HF& hf, const CF& cf, const GF& gf)
顺便说一句,您可能需要花5秒时间考虑有意义的名字。如果V
有一个合理的名称,那么可能更明显的是它没有用处。
答案 1 :(得分:2)
有一个尚未解决的模板参数VALUE。它永远不会被使用。
如果正在身体的某个地方使用它,你的功能应该已经能够派生出来。如果它派生自不同的模板参数,请确保您有这样做的方法。可能该模板参数具有内部typedef,例如,如果您的某个比较函数比较了此类型的值,则它们可能具有value_type typedef。
如果以这种方式完成,请确保在正文中使用typename。
答案 2 :(得分:1)
鉴于已编辑的声明
template<class KEY, class VALUE, class HASH_FUNCTION,
class COMPARATOR_FUNCTION, class GREATER_THAN_FUNCTION>
bool Test3(size_t szCount, double dLoadFactor, vector<KEY>& vVals,
const HASH_FUNCTION& hf, const COMPARATOR_FUNCTION& cf,
const GREATER_THAN_FUNCTION& gf);
并且注释:V
由函数Test3使用。有没有办法让我告诉编译器V
的类型是什么?
Test3(1000, 0.7f, vVals, sh, cf, gf);
的问题是编译器无法推导出模板参数VALUE
。但您可以将模板参数显式列出为函数名称,如下所示:
Test3<const char*, value_type>(1000, 0.7f, vVals, sh, cf, gf);
此处前两个模板参数KEY
= const char*
和VALUE
= value_type
在<
尖括号>
中给出,休息可以由编译器推断出来。
如果您更改了模板声明中KEY
和VALUE
的顺序,则可以跳过提供KEY
并推断:
template<class VALUE, class KEY, class HASH_FUNCTION,
class COMPARATOR_FUNCTION, class GREATER_THAN_FUNCTION>
bool Test3(size_t szCount, double dLoadFactor, vector<KEY>& vVals,
const HASH_FUNCTION& hf, const COMPARATOR_FUNCTION& cf,
const GREATER_THAN_FUNCTION& gf);
// ...
Test3<value_type>(1000, 0.7f, vVals, sh, cf, gf);