静态成员函数错误;如何正确签名?


165

尝试使用当前签名在g ++中编译代码时出现错误:

cannot declare member function static void Foo::Bar(std::ostream&, const Foo::Node*) to have static linkage

我的问题是双重的:

  1. 为什么不这样编译?
  2. 什么是正确的签名,为什么?

使用C ++时签名始终是我的死

编辑:这也是类头文件:

class Foo {


public:
    Foo();

    ~Foo();

    bool insert(const Foo2 &v);

    Foo * find(const Foo2 &v);

    const Foo * find(const Foo2 &v) const;

    void output(ostream &s) const;

private:
    //Foo(const Foo &v);
    //Foo& operator =(const Foo &v);
    //Not implemented; unneeded


    struct Node {
        Foo2 info;
        Node *left;
        Node *right;
    };

    Node * root;

    static bool insert(const Foo2 &v, Node *&p);


    static void output(ostream &s, const Node *p);


    static void deleteAll(Node *p);

您应该包括g ++错误中的所有相关行。
Keith Layne

5
您列出的错误消息不能由您发布的代码产生。Foo::Bar您的程序片段中没有任何内容。请张贴一个完整的最小的程序,证明您有错误。一个完整的程序是一个我们可以准确编译原样并收到同样的错误消息,因为你。一个最小的程序是删除与错误无关的每一行。您发布的代码片段既不完整也不是最少。有关更多信息,请参见sscce.org
罗布(Robᵩ)2011年

Answers:


415

我猜你已经做了类似的事情:

class Foo
{
    static void Bar();
};

...

static void Foo::Bar()
{
    ...
}

static void Foo::Bar”不正确。您不需要第二个“ static”。


25
@Oliver:那为什么呢?
narengi 2015年

14
@narengi:因为这是C ++标准定义语法的方式。
奥利弗·查尔斯沃思

2
哪个是“第二个”?声明符中的那个还是函数定义中的on?
dhein

44
@Zaibis第二个不是第一个,而是第二个。
maxdev 2015年

24
关键字static在方法声明中与函数定义中的含义不同。如果函数(定义)是类的方法(声明),则该函数不能为静态。因此,您可以将其声明为静态,但不能将其定义为静态。在函数定义中,“静态”的含义与C中的含义相同,后者与类方法不兼容。
dabicho
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.