Lỗi chức năng thành viên tĩnh; Làm thế nào để viết đúng chữ ký?


165

Tôi gặp lỗi khi cố gắng biên dịch mã của mình trong g ++ bằng chữ ký hiện tại:

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

Câu hỏi của tôi có hai mặt:

  1. Tại sao nó không biên dịch theo cách này?
  2. Chữ ký chính xác là gì, và tại sao?

Chữ ký luôn là cái chết của tôi khi sử dụng C ++

Chỉnh sửa: Đây cũng là tệp tiêu đề lớp:

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);

Bạn nên bao gồm tất cả các dòng có liên quan từ lỗi g ++.
Keith Layne

5
Thông báo lỗi bạn liệt kê không thể được tạo bởi mã bạn đã đăng. Không có Foo::Barbất cứ nơi nào trong đoạn chương trình của bạn. Vui lòng đăng một chương trình hoàn chỉnh , tối thiểu thể hiện lỗi bạn đang gặp phải. Một chương trình hoàn chỉnh là một chương trình mà chúng tôi có thể biên dịch chính xác và nhận được thông báo lỗi giống như bạn. Một chương trình tối thiểu là một chương trình với mỗi dòng không liên quan đến lỗi của bạn được xóa. Đoạn mã bạn đăng không đầy đủ cũng không tối thiểu. Xem sscce.org để biết thêm.
Robᵩ

Câu trả lời:


415

Tôi đoán bạn đã làm một cái gì đó như:

class Foo
{
    static void Bar();
};

...

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

" static void Foo::Bar" Không chính xác. Bạn không cần "" thứ hai static.


25
@Oliver: Nhưng tại sao?
narengi

14
@narengi: vì đó là cách tiêu chuẩn C ++ định nghĩa ngữ pháp.
Oliver Charlesworth

2
Cái nào là "thứ hai"? một trong khai báo hoặc bật trong định nghĩa chức năng của nó?
dhein

44
@Zaibis cái thứ hai không phải cái thứ nhất, mà là cái thứ hai.
maxdev

24
Từ khóa tĩnh không có cùng ý nghĩa trong khai báo phương thức so với định nghĩa hàm. Và một hàm (định nghĩa) không thể tĩnh nếu đó là phương thức của lớp (khai báo). Do đó, bạn có thể khai báo nó tĩnh, nhưng không xác định nó tĩnh. Trong định nghĩa hàm 'tĩnh' có cùng ý nghĩa như trong C, không tương thích với một phương thức lớp.
dabicho
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.