相关疑难解决方法(0)

C++:为什么成员函数优先于全局函数

为什么在下一个程序中成员函数foo优先于全局foo,尽管全局foo匹配类型?

#include <iostream>
using namespace std;

void foo(double val) { cout << "double\n";}

class obj {
public:
  void callFoo() { foo(6.4); }
private:
  void foo(int val) {cout << "class member foo\n"; }
};

int main() { 
  obj o;
  o.callFoo();
}
Run Code Online (Sandbox Code Playgroud)

c++ overloading

8
推荐指数
2
解决办法
735
查看次数

如何判断当前函数是C++ 11中的常规函数​​还是静态成员函数?

我会试着解释一下我要做的事情:

bool if_filter_applies() {return true;}

#defile LOGFILE if( if_filter_applies() ) LOG_STREAM_OBJECT

void globalFunc() { LOGFILE << "Some data \n"; }

class C {
    int a;
    bool if_filter_applies() {
       if ( a == 1)
          return true;
       else
          return false;
       }
 public:
   void regMem () {
      LOGFILE << "Some data\n";
   }
   static void staticMem() {
      LOGFILE << "Some data\n";
   }
 };
Run Code Online (Sandbox Code Playgroud)

我正在尝试修改LOGFILE定义,以便它只在基于成员函数的输出从类的成员函数中使用时才写入流if_filter_applies().

如果从类外部或静态成员函数中使用LOGFILE,我希望它使用Global if_filter_applies()函数(总是返回true).

上面的代码没有编译,因为static void staticMem()最终使用if_filter_applies()类成员而不是全局.

我不想创建一个类似于#define LOGFILE静态成员函数替换的不同定义,因为我们的代码中有数百个文件,我不想手动替换所有出现的内容.

那么我可以对#defile LOGFILE宏进行任何更改,以便它 …

c++ static static-members c-preprocessor c++11

6
推荐指数
1
解决办法
219
查看次数

未见类外的函数重载

考虑以下代码片段:

enum class Bar {
    A
};

void foo(Bar) {}

struct Baz {
    void foo() {
        foo(Bar::A);
    }
};
Run Code Online (Sandbox Code Playgroud)

它无法编译,来自 gcc 9.2 的消息是:

:12:19: error: no matching function for call to 'Baz::foo(Bar)'
 12 |         foo(Bar::A);
    |              
Run Code Online (Sandbox Code Playgroud)

我不怀疑这是一个错误,因为 clang 10 也失败了。关于这种情况,我有两个问题:

  1. 标准在哪里定义了这种重载的行为?

  2. 以这种方式指定编译器行为的可能原因是什么?

活生生的例子

c++ overloading language-lawyer name-lookup

1
推荐指数
2
解决办法
83
查看次数