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

4

可能是重复问题:
如何获取重载成员函数的地址?

我在一个继承层次结构的类中有一组类型重载的函数,例如,Share派生出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'

我应该如何正确调用重载函数?我认为当调用func时,TShare会解决函数重载的问题? 编辑 我忘记将重载函数标记为静态。

1个回答

2

这段代码无法编译,因为ShareUtils::getRank不是指向单个函数的指针,而是指向一组函数(该名称有几个签名)。

你需要将其转换为函数指针以消除歧义,这意味着你必须从rank函数中知道应该调用哪个getRank(在你的情况下不应该是问题):

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

抱歉,我忘记将重载函数标记为静态的。 - Graeme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接