C++ 将函数定义为静态成员和自由成员之间有什么区别?

C++ 将函数定义为静态成员和自由成员之间有什么区别?,c++,overloading,C++,Overloading,考虑以下代码段: #include <iostream> using namespace std; struct Element { void SetVisible(bool) { cout << "Called SetVisible on Element" << endl; } }; struct ElementQuery { ElementQuery(Element * e) : element(e) { } Element

考虑以下代码段:

#include <iostream>

using namespace std;

struct Element {
    void SetVisible(bool) { cout << "Called SetVisible on Element" << endl; }
};

struct ElementQuery {
    ElementQuery(Element * e) : element(e) { }
    Element * Get() const { return element; }
    Element * element;
};

namespace A {

static void SetVisible(ElementQuery const& element, bool show) {
    cout << "Called SetVisible on ElementQuery" << endl;
    SetVisible(element.Get(), show);
}

static void SetVisible(Element * element, bool show) {
    element->SetVisible(show);
}

};

int main() {
    Element * e = new Element();
    ElementQuery q(e);
    A::SetVisible(q, true);
    delete e;
    return 0;
}
#包括
使用名称空间std;
结构元素{

void SetVisible(bool){cout似乎根本不应该编译此代码。因为此调用: SetVisible(element.Get(),show);
$void SetVisible(Element*Element,bool show)在调用时不可见。您需要将此函数移到$void SetVisible(ElementQuery const&Element,bool show)之前。

似乎根本不应该编译此代码。因为此调用: SetVisible(element.Get(),show);
$void SetVisible(Element*Element,bool show)在调用时不可见。您需要将此函数移到$void SetVisible(ElementQuery const&Element,bool show)之前。

这是因为命名空间是按顺序处理的,并且元素和ElementQuery之间存在转换(因为您的构造函数不显式)

这是正确的代码

#include <iostream>

using namespace std;

struct Element {
    void SetVisible(bool) { cout << "Called SetVisible on Element" << endl; }
};

struct ElementQuery {
    explicit ElementQuery(Element * e) : element(e) { }
    Element * Get() const { return element; }
    Element * element;
};

namespace A {

static void SetVisible(Element * element, bool show) {
    cout << "Called A::SetVisible on Element" << endl;
    element->SetVisible(show);}

static void SetVisible(ElementQuery const& element, bool show) {
    cout << "Called A::SetVisible on ElementQuery" << endl;
    SetVisible(element.Get(), show);
}

};

int main() {
    Element * e = new Element();
    ElementQuery q(e);
    A::SetVisible(q, true);
    delete e;
    return 0;
}
#包括
使用名称空间std;
结构元素{

void SetVisible(bool){cout这是因为名称空间是按顺序处理的,并且元素和ElementQuery之间存在转换(因为构造函数不是显式的)

这是正确的代码

#include <iostream>

using namespace std;

struct Element {
    void SetVisible(bool) { cout << "Called SetVisible on Element" << endl; }
};

struct ElementQuery {
    explicit ElementQuery(Element * e) : element(e) { }
    Element * Get() const { return element; }
    Element * element;
};

namespace A {

static void SetVisible(Element * element, bool show) {
    cout << "Called A::SetVisible on Element" << endl;
    element->SetVisible(show);}

static void SetVisible(ElementQuery const& element, bool show) {
    cout << "Called A::SetVisible on ElementQuery" << endl;
    SetVisible(element.Get(), show);
}

};

int main() {
    Element * e = new Element();
    ElementQuery q(e);
    A::SetVisible(q, true);
    delete e;
    return 0;
}
#包括
使用名称空间std;
结构元素{

void SetVisible(bool){类中任何地方声明的cout成员在类中的任何地方都可见。我认为没有比这更重要的了。很好的例子说明了为什么构造函数应该是显式的。If ElementQuery(Element*e)如果是显式的,代码甚至不会编译。Charles Bailey引用的问题的大多数投票结果都向我表明了这一点。如果你让Tomek建议的构造函数显式,并在命名空间A中切换SetVisible函数的顺序,那么works@wreckgar23@CharlesBailey好的,现在我明白了,你能详细说明一个简短的答案吗?还有m点e
struct
的作用域以这种方式扩展的原因是什么。@Crankgar23:我怀疑这项功能是为类添加的,因为预计一个类相对于整个程序来说相当小,因此在声明之前就在作用域中的东西是合理无误的。没有它是从C继承的,编译器对多个通道会感到困惑,但是在C++的时候,它更让程序员感到困惑。在类中的任何地方声明的成员在类中到处可见。我认为没有比它更重要的东西。为什么构造函数应该是显式的伟大例子。如果元素查询(要素*e)如果是显式的,代码甚至不会编译。Charles Bailey引用的问题的大多数投票结果都向我表明了这一点。如果你让Tomek建议的构造函数显式,并在命名空间A中切换SetVisible函数的顺序,那么works@wreckgar23@CharlesBailey好的,现在我明白了,你能详细说明一个简短的答案吗?还有m点e
struct
的作用域以这种方式扩展的原因是什么。@Crankgar23:我怀疑这项功能是为类添加的,因为预计一个类相对于整个程序来说相当小,因此在声明之前就在作用域中的东西是合理无误的。没有它是从C继承的,编译器对多个通道会感到困惑,但是在C++的时候,它更容易混淆程序员。你可以尝试编译它。因为代码> EntQueQue>代码有一个隐含的构造函数,它把<代码>元素*/COD>作为参数。你可以试试。它编译为<代码>元素tQuery
具有隐式构造函数,该构造函数将
元素*
作为参数。