首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数重载和读取fdump树-所有输出

函数重载和读取fdump树-所有输出
EN

Stack Overflow用户
提问于 2015-07-31 14:48:32
回答 1查看 111关注 0票数 0

我正在研究下面列出的函数重载问题,发现下面的代码没有编译。

代码语言:javascript
复制
#include<iostream>
class Test {
   static void fun(int i) {}
   void fun(int i) {}   
};

int main()
{
   Test t;
   return 0;
}

我的理解是,成员函数在隐式编译时有一个额外的参数,一个指向已编译函数中的对象的指针。我不知道静态函数发生了什么变化。现在,为了弄清楚编译器在做什么,我尝试运行g++ -fdump-tree-all failed_overload.cxx,并得到以下文件:

代码语言:javascript
复制
         failed_overload.cxx.001t.tu
         failed_overload.cxx.002t.class
         failed_overload.cxx.003t.original
         failed_overload.cxx.004t.gimple
         failed_overload.cxx.204t.statistics

我查看了gimple输出,发现了以下内容:

**

代码语言:javascript
复制
static void Test::fun(int) (int i)
{
  GIMPLE_NOP
}
void Test::fun(int) (struct Test * const this, int i)
{
  GIMPLE_NOP
}

**

静态函数似乎只有int参数,但是成员函数有额外的这个参数。如果是这样的话,为什么编译失败,为什么我们不能用相同的签名重载静态函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-31 14:57:19

如果您的静态函数和非静态函数都具有相同的参数集,那么在类的方法(非静态)的调用中,不可能区分程序员想要调用静态函数还是非静态函数。示例:

代码语言:javascript
复制
#include<iostream>
class Test {
   static void fun(int i) { std::cout << 2*i; }
   void fun(int i) { std::cout << i; }   
   void otherFunc() {
      fun(3); // Ambiguity: is static or non-static function intended?
   }
};

int main()
{
   Test t;
   t.otherFunc();
   return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31749096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档