Предположим, мы имеем следующие файлы (взято из языка ++ Программирование B.Stroustup C):C++ двойная декларация/определение?
stack.h
namespace Stack{
void push(int);
int pop();
class Overflow{};
}
stack.cpp
#include "stack.h"
namespace Stack{
const int max_size = 1000;
int v[max_size];
int top;
class Overflow{};
}
void Stack::push(int elem){
if(top >= max_size){
throw Overflow();
}
v[top++] = elem;
}
int Stack::pop(){
if(top <= 0){
throw Overflow();
}
return v[--top];
}
Я не понимаю почему объявление/определение (?) класса Overflow {} в stack.h также должно быть записано в stack.cpp?
Неправильно ли написать такой код?
ОБНОВЛЕНИЕ
main.cpp
#include <iostream>
#include "stack.h"
using namespace std;
int main(){
try{
int a = 0;
while(true){
Stack::push(a++);
}
} catch(Stack::Overflow){
cout << "Stack::Overflow exception, YEAH!" << endl;
}
return 0;
}
я компилировать код с: г ++ main.cpp -o stack.cpp Основной
г ++ i686-яблонь darwin11-llvm-g ++ - 4.2 (GCC) 4.2.1 (основано на Apple Inc. build 5658) (LLVM build 2336.11.00)
UPDATE (решение)
Попробовав г ++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3 код дал мне об ошибке: stack.cpp: 7: 9: ошибка: переопределение «Класс Stack :: Overflow». Это, конечно, правильно.
Основная информация: предыдущая версия g ++ на mac имеет ошибку.
Выглядит странно. –