2010-03-24 2 views
3

следующий кусок кода на C++, скомпилированный два года назад в suse 10.1 Linux-машине.Ошибка C++: ожидаемый инициализатор перед '&' token

#ifndef DATA_H 
#define DATA_H 
#include <iostream> 
#include <iomanip> 


inline double sqr(double x) { return x*x; } 
enum Direction { X,Y,Z }; 

inline Direction next(const Direction d) 
{ 
    switch(d) 
    { 
    case X: return Y; 
    case Y: return Z; 
    case Z: return X; 
    } 
} 

inline ostream& operator<<(ostream& os,const Direction d) 
{ 
    switch(d) 
    { 
    case X: return os << "X"; 
    case Y: return os << "Y"; 
    case Z: return os << "Z"; 
    } 
} 
... 
... 

Теперь я пытаюсь скомпилировать его на Ubuntu 9.10, и я получаю ошибку:

data.h:20: error: expected initializer before ‘&’ token 

, которая называется линией:

инлайн ostream & оператора < < (ostream & os, const Направление d)

g ++, используемый на этой машине:

Using built-in specs. 
Target: x86_64-linux-gnu 
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.1-4ubuntu9' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 
Thread model: posix 
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9) 

Не могли бы вы рассказать мне об этой ошибке?

Thanks

P.D. Если я делать зЬй :: ostream, я получаю ошибки:

data.h:20: error: declaration of ‘operator<<’ as non-function 
data.h:20: error: ‘ostream’ was not declared in this scope 
data.h:20: error: ‘os’ was not declared in this scope 
data.h:20: error: expected primary-expression before ‘const’ 
+2

Вы использовали 'зЬй :: ostream' в определение 'os' тоже? Ошибки, которые вы получаете, теперь предполагают, что вы этого не сделали. – Gorpik

ответ

11

Как все в стандартной библиотеке C++, ostream живет в пространстве имен std, поэтому это std::ostream.

Я считаю, что если это использовалось для компиляции, это было ошибкой.

+0

hi, i dothat, а затем я получаю data.h: 23: ошибка: объявление оператора «<< как не функционирующее data.h: 23 : ошибка: «ostream» не был объявлен в этой области data.h: 23: ошибка: «os» не была объявлена ​​в этой области данных.h: 23: ошибка: ожидаемое первичное выражение перед 'const' – flow

+0

Кстати, может ли код быть отформатирован в комментариях? – flow

+0

@ Вернер: Не совсем. Вы должны отредактировать свой вопрос с новой информацией. Тем не менее, используйте обратные ссылки: \ 'code идет здесь \', чтобы получить * some * форматирование: 'code идет здесь'. Я избежал прежних обратных следов с обратной косой чертой. – GManNickG

7

ostream класс является частью стандартной библиотеки iostream в C++, и определяется в пространстве имен std

так что вы, вероятно, следует добавить std:: перед тем ostream
или

using namespace std; 

, но, как было сказано в одном из комментариев:

You should never use using namespace std in a header as it can propagate to other files.

+5

-1. Вы должны ** никогда не использовать 'using namespace std' в заголовке, поскольку он может распространяться на другие файлы. – Yacoby

+0

Это не повод не упоминать об этом в ответе, он может иметь такую ​​же проблему в файле cpp (и есть хорошие шансы на это). Но я согласен, что должен был добавить отказ от ответственности :) Я никогда не делаю этого сам, поэтому я не думал об этом - исправьте, вы можете перезвонить своим голосам, если вы простите меня :) –

+0

@ f4: Прощено и удалено. ':)' – sbi

2

Вы забыли поставить std :: перед каждым вхождением ostream. Кроме того, вы должны принять направление в качестве эталона (в то время как в данном случае, это не повредит):

inline std::ostream& operator<<(std::ostream& os,const Direction& d) 
+0

Что такое коэффициент усиления в обработке ссылки на перечисление? Если он передан как ссылка или 'int', это будет тот же самый способ монтирования данных: 32 или 64 бит. – spoulson

+0

Передача встроенных данных, ins или enums в качестве ссылки на const не является такой хорошей практикой. Передача их по значению, как и в OP-коде, отлично подходит. – Gorpik

+0

Вот почему я сказал: '(пока в этом случае это не повредит) :-) ' –

1

вам не хватает запятой

inline Direction next(const Direction d) 
{ 
    switch(d) 
    { 
    case X: return Y; 
    case Y: return Z; 
    case Z: return X; 
    } 
}**;**//missing semicolon 

inline ostream& operator<<(ostream& os,const Direction d) 
{ 
    switch(d) 
    { 
    case X: return os << "X"; 
    case Y: return os << "Y"; 
    case Z: return os << "Z"; 
    } 
}`  
+1

-1. Только если предыдущие были классом. –

+0

Почему, по-вашему, у него отсутствует полуколока на первой встроенной функции, но не на второй? – Mawg

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