使用模板调用重载函数(未解析的重载函数类型编译器错误) [英] Calling overloaded function using templates (unresolved overloaded function type compiler error)

查看:306
本文介绍了使用模板调用重载函数(未解析的重载函数类型编译器错误)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


可能重复:

如何获取重载成员函数的地址?


我有一个重载的类继承的父类的一组类型的函数,例如与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分享));
}
return * member;
}

boost :: optional< unsigned>秩_;

// -------

静态无符号ShareUtils :: getRank(const Share& share){// ...}
static unsigned ShareUtils :: getRank(const OptionShare& option){// ...}
静态无符号ShareUtils :: getRank(const FutureShare& future){// ...}



编译时出现以下错误:

  Share.h:在成员函数`virtual unsigned int Share :: rank()const':
Share.h:25:error:没有匹配的函数调用`Share :: getValue(const Share& boost :: optional< unsigned int>&,< unsresolved overloaded function type>)const'

我是否正确调用重载函数?我认为TShare会在调用func时解决重载问题。



EDIT
我忘记标记重载函数static。

解决方案

这不能编译,因为 ShareUtils :: getRank 函数,而是一个系列函数(这个名称有几个签名)。



你想要转换为函数指针来抑制歧义,这意味着你必须从 rank 函数知道哪个 getRank 应该被调用你的case):

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


Possible Duplicate:
How to get the address of an overloaded member function?

I have a function overloaded for a set of types in a class inheritence heirarchy, e.g. Share with FutureShare and OptionShare derived.

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) { //... } 

When compiling I get the following error:

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'

How do I correctly call the overloaded function? I figured TShare would resolve the overload when calling func?

EDIT I forgot to mark the overloaded functions static.

解决方案

This fails to compile because ShareUtils::getRank does not refer to a single function but to a family of functions (there are several signatures for this name).

You want to cast to function pointer to suppress the ambiguity, which means that you must know from the rank function which getRank should be called (which should not be a problem in your case) :

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

这篇关于使用模板调用重载函数(未解析的重载函数类型编译器错误)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆