Помилка статичних функцій члена; Як правильно написати підпис?


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 ++.
Кіт Лейн

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 ++ визначає граматику.
Олівер Чарльворт

2
Який "другий"? той, що в деклараторі, або включений у його визначенні функції?
dhein

44
@Zaibis друга не перша, а друга.
maxdev

24
Ключове слово статичний має не те саме значення в оголошенні методу, як у визначенні функції. І функція (визначення) не може бути статичною, якщо це метод класу (оголошення). Отже, ви можете оголосити його статичним, але не визначити статичним. У визначенні функції 'static' має те саме значення, що і в C, яке несумісне з методом класу.
dabicho
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.