奇怪的模板问题

时间:2011-01-20 15:56:22

标签: c++ templates g++

我定义了以下功能:

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&)’

我可能错过了一些明显的东西。任何帮助,将不胜感激。感谢。

3 个答案:

答案 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<尖括号>中给出,休息可以由编译器推断出来。

如果您更改了模板声明中KEYVALUE的顺序,则可以跳过提供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);