정적 멤버 함수 오류; 서명을 올바르게 작성하는 방법?


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 ++ 오류의 모든 관련 줄을 포함해야 합니다.
키이스 Layne

5
게시 한 코드로 나열된 오류 메시지를 생성 할 수 없습니다. Foo::Bar프로그램 조각 에는 어디에도 없습니다 . 발생한 오류를 보여주는 완전 하고 최소한의 프로그램을 게시하십시오 . 전체 프로그램은 그대로과 같은 오류 메시지가 나타납니다 우리가 정확하게 컴파일 할 수 있다는 것입니다. 최소한의 프로그램은 제거하여 오류와 관련이없는 모든 라인입니다. 게시 한 코드 조각이 완전하지도 최소가 아닙니다. 자세한 내용은 sscce.org 를 참조하십시오 .
Robᵩ

답변:


415

나는 당신이 다음과 같은 것을 한 것으로 추측합니다.

class Foo
{
    static void Bar();
};

...

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

" static void Foo::Bar"이 잘못되었습니다. 두 번째 " static" 가 필요하지 않습니다 .


25
@Oliver : 그런데 왜?
narengi

14
@narengi : C ++ 표준이 문법을 정의하는 방식입니다.
Oliver Charlesworth

2
"두 번째"는 어느 것입니까? 선언자 또는 함수 정의에서 on?
dhein

44
@Zaibis 두 번째는 첫 번째가 아니라 두 번째입니다.
maxdev

24
static 키워드는 함수 정의 에서와는 달리 메소드 선언에서 의미가 없습니다. 그리고 함수 (정의)가 클래스의 메소드 (선언) 인 경우 정적 일 수 없습니다. 따라서 정적으로 선언 할 수는 있지만 정적으로 정의 할 수는 없습니다. 함수 정의에서 '정적'은 클래스 메소드와 호환되지 않는 C와 동일한 의미를 갖습니다.
dabicho
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.