2012-02-28 3 views
2

Рассмотрит followin определения простого класса -определения статической функции класса вне определения класса

// file A.h 
#include <iostream> 
class A { 
public: 
    static int f(); 
    static const int aa; 
}; 


    // file A.cpp 
#include "a.h" 
using namespace std; 
const int A::aa = 10; 
int A::f() { 
    return A::aa; 
} 

И это мой главный файл -

// main.cpp file 
#include "a.h" 
#include "b.h" 
using namespace std; 
const int A::aa = 100; 
int A::f(); 
int main() { 
    cout << A::aa << "\n"; 
    cout << A::f() << "\n"; 
} 

Когда я пытаюсь скомпилировать main.cpp, то компилятор жалуется, что объявление A :: f() в main.cpp вне класса является объявлением, а не определением. Почему это? Я не намерен определять A :: f() в main.cpp. Он определен в A.cpp, и компоновщик должен связать объявление A :: f() в main.cpp с его определением в A.cpp. Поэтому я не понимаю, почему я получаю эту ошибку. Обратите внимание, что это ошибка компиляции.

+0

Почему у вас есть эта линия? –

+0

Где находится файл "b.h" – NinjaCoder

+0

его не включает. Нашел проблему. – user236215

ответ

3

C++ 11 стандарт §9.3 [class.mftc] p3:

[...] для определения функций-членов, которые появляются вне определения класса и явных специализаций функций-членов шаблонов классов и членов, за исключением исключения функциональные шаблоны (14.7), выходящие за пределы определения класса, функция-член не должна быть переоформлена.

Помимо этого, вы получите сообщение об ошибке компоновщика из-за многочисленные определения A::aa, но мне кажется, что вы ожидали, что, судя по вашей последней фразе.

0

Во втором пропущено, вы не должны объявить метод А.

1

Класс и его члены уже определены, вы просто должны включить этот файл в ваш основной (который вы сделали). Вам не нужно объявлять или переопределять его.

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