使用模板调用重载函数(未解析的重载函数类型编译器错误)

时间:2012-01-23 10:24:12

标签: c++ templates overloading

  

可能重复:
  How to get the address of an overloaded member function?

我在类继承层次结构中为一组类型重载了一个函数,例如:与FutureShare和OptionShare共享。

virtual unsigned rank() const
{ return getValue(*this, rank_, &ShareUtils::getRank); } 

template<typename TShare , typename TMember, typename TGetMemberFunc >
TValue& getValue(const TShare& share, boost::optional<TMember>& member, TGetMemberFunc func)
{
    if(!member)
    {
        member.reset(func(share));
    }
    return *member;
}

boost::optional<unsigned> rank_;

//-------

static unsigned ShareUtils::getRank(const Share& share) { //... } 
static unsigned ShareUtils::getRank(const OptionShare& option) { //... } 
static unsigned ShareUtils::getRank(const FutureShare& future) { //... } 

编译时出现以下错误:

Share.h: In member function `virtual unsigned int Share::rank() const':
Share.h:25: error: no matching function for call to `Share::getValue(const Share&, boost::optional<unsigned int>&, <unresolved overloaded function type>) const'

如何正确调用重载函数?我想TShare会在调用func时解决重载问题吗?

修改 我忘了将重载函数标记为静态。

1 个答案:

答案 0 :(得分:2)

这无法编译,因为ShareUtils::getRank不是指单个函数,而是指函数的系列(此名称有多个签名)。

您希望转换为函数指针以抑制歧义,这意味着您必须从rank函数中知道应该调用哪个getRank(在您的情况下这应该不是问题):

virtual unsigned rank() const
{ return getValue(*this, rank_, (unsigned (ShareUtils::*)(const Share&)) &ShareUtils::getRank); }