【问题标题】:How to call a static method member of a class when there is member method of the same name?有同名成员方法时,如何调用类的静态方法成员?
【发布时间】:2020-12-08 10:09:23
【问题描述】:

我有一个类foo,有两种方法:

static void BuildToto(...);
void BuildToto(...);

这两种方法的原型完全相同,只是一种是静态的,另一种不是。

在同一个类的第三种方法中,我想调用静态方法而不是另一个。所以,天真地,我写了这个:

foo::BuildToto();

但是在调试时,很明显代码执行起来就像上面一行中的指针 this 一样。如何显式调用静态方法?

【问题讨论】:

  • 这不会编译,并且对于使用这个类的任何人来说都是相当混乱的。您需要重命名其中一个。
  • 确实! Clang 说:错误:不能重载具有相同参数类型的静态和非静态成员函数
  • 奇怪的是在 Visual Sutido 2019 中,它编译了!好的,如果没有其他方法可以继续,我将重命名方法...
  • 我的 VS 说“不能用相同的参数类型重载静态和非静态成员函数”!?

标签: c++ class static-methods


【解决方案1】:

您不能:重载解析将失败,因为无法使用语法来区分它们。

除了重命名其中一个函数之外,一种解决方法是将其中一个函数模板化:

#include <iostream>
using namespace std;

struct Foo
{
    template<typename> void foo(int n) const {
        std::cout << "member\n";
    };
    static void foo(int n){
        std::cout << "static\n";
    }
};

int main() {        
    Foo::foo(1); // static
    Foo f;
    f.foo<void>(1); // member       
}

【讨论】:

    【解决方案2】:

    好的,我解开了这个谜:

    我的两种方法没有完全相同的原型,除了一种在其输入中有一个向量,而另一种在向量上有一个 smart_pointer。 不幸的是,我通过不取消引用 sp 来调用错误的版本。所以没有编译器错误。这两种方法具有相同的名称和几乎相同的原型这一事实引发了我的问题。

    所以我会注意在方法的静态版本中添加一些后缀,以避免将来出现任何混淆...... 对静态方法名称的后缀有任何想法吗?

    【讨论】:

    • 我建议删除问题。保留它是没有意义的,因为它是基于错误的。
    • 好的,但是如何删除呢?
    猜你喜欢
    • 1970-01-01
    • 2012-10-19
    • 2010-12-17
    • 2019-01-10
    • 2010-09-24
    • 1970-01-01
    • 2012-03-31
    • 2014-07-28
    • 1970-01-01
    相关资源
    最近更新 更多