2013-03-31 2 views
8

Я определил функцию как статический в своем классе таким образом (фрагмент соответствующего кода)Статическая функция: класс хранения не может быть указан здесь

#ifndef connectivityClass_H 
#define connectivityClass_H 

class neighborAtt 
{ 
public: 
    neighborAtt(); //default constructor 
    neighborAtt(int, int, int); 

    ~neighborAtt(); //destructor 

    static std::string intToStr(int number); 

private: 
    int neighborID; 
    int attribute1; 
    int attribute2; 

#endif 

и в файле .cpp, как

#include "stdafx.h" 
#include "connectivityClass.h" 

static std::string neighborAtt::intToStr(int number) 
{ 
    std::stringstream ss; //create a stringstream 
    ss << number; //add number to the stream 
    return ss.str(); //return a string with the contents of the stream 
} 

и я получаю сообщение об ошибке (VS C++ 2010) в файле .cpp, в котором говорится: «Здесь не может быть указан класс хранения», и я не могу понять, что я делаю неправильно.

p.s. Я уже читал this, который выглядит как дубликат, но я не знаю, как он это делает, - что я прав, а компилятор - изящный. Любая помощь приветствуется, я не могу найти никакой информации об этом!

ответ

19

В определении в файле .cpp, удалить ключевое слово static:

// No static here (it is not allowed) 
std::string neighborAtt::intToStr(int number) 
{ 
    ... 
} 

До тех пор, пока у вас есть static ключевое слово в файле заголовка, компилятор знает, что это статический метод класса, так что вы не должны и не может указывать его в определении в исходном файле.

В C++ 03, спецификаторы класса хранений являются ключевыми словами auto, register, static, extern и mutable, которые говорят компилятору, как хранятся данные. Если вы видите сообщение об ошибке, ссылающееся на спецификаторы класса хранения, вы можете быть уверены, что ссылается на одно из этих ключевых слов.

В C++ 11 ключевое слово auto имеет другое значение (оно больше не является спецификатором класса хранения).

+0

Вы уверены, что используете 'mutable'? Он выглядит как спецификатор * storage-class-specifier * в BNF, но он не ведет себя как один. И 'thread_local' является спецификатором класса хранения в C++ 11. –

+0

@BenVoigt: Да, C++ 03 §7.7.1 явно перечисляет эти 5 спецификаторов. –

Смежные вопросы