静的メンバー関数エラー。署名を適切に書き込む方法は?


165

現在の署名を使用してg ++でコードをコンパイルしようとすると、エラーが発生します。

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

私の質問は2つあります。

  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ᵩ

回答:


415

私はあなたが次のようなことをしたと思います:

class Foo
{
    static void Bar();
};

...

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

static void Foo::Bar」は正しくありません。2番目の " static" は必要ありません。


25
@オリバー:しかし、なぜですか?
narengi 2015年

14
@narengi:C ++標準が文法を定義する方法だからです。
Oliver Charlesworth、2015年

2
「2番目」はどれですか?宣言子にあるものか、関数定義にある?
dhein

44
@Zaibis 2番目は1番目ではなく2番目です。
maxdev

24
キーワードstaticは、メソッド宣言では関数定義と同じ意味を持ちません。また、関数(定義)は、クラスのメソッド(宣言)である場合、静的であってはなりません。したがって、静的に宣言することはできますが、静的に定義することはできません。関数定義では、「静的」はCと同じ意味であり、クラスメソッドと互換性がありません。
dabicho 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.