请教:error C2143: syntax error : missing ';' before '&'
tuqu 2005-06-20 05:42:17 c++primer中的3.15类类型中的例子,用vc++2003编译
//String.h
#include <cstring>
#include <cassert>
#include <iomanip>
class String
{
public:
//a set of overload constructor
//provide initialize
//string str1; //string()
//string str2("literal") //string (const char*);
//string str3(str2);//string (const string&);
String();
String(const char*);
String (const String&);
//deconstructor:auto
~String();
//
String& operator=(const String&);
String&operator=(const char*);
//
bool operator==(const String&);
bool operator==(const char*);
//
char& operator[](int);
//
int size(){return _size;}
char *c_str(){return _string; }
private:
int _size;
char *_string;
};
inline String::String()
{
_size=0;
_string=0;
}
inline String::String(const char*str)
{
if (!str)
{
_size=0;
_string=0;
}
else
{
_size=strlen(str);
_string=new char[_size+1];
strcpy(_string,str);
}
}
inline String::String(const String&rhs)
{
_size=rhs._size;
if (!rhs._string)
_string=0;
else
{
_string=new char[_size+1];
strcpy(_string,rhs._string);
}
}
inline String::~String()
{
delete [] _string;
}
inline bool String::operator==(const String &rhs)
{
if(_size!=rhs._size)
return false;
return strcmp(_string,rhs._string)?false:true;
}
inline bool String::operator==(const char*str)
{
if(_size!=strlen(str))
return false;
return strcmp(_string,str)?false:true;
}
inline String &String::operator=(const String&rhs)
{
if(this!=&rhs)
{
delete [] _string;
_size=rhs._size;
if (!rhs._string)
_string=0;
else
{
_string=new char[_size+1];
strcpy(_string,rhs._string);
}
}
return *this;
}
inline String &String::operator=(const char*s)
{
if (!s)
{
_size=0;
delete [] _string;
_string=0;
}
else
{
_size=strlen(s);
delete [] _string;
_string=new char[_size+1];
strcpy(_string,s);
return *this;
}
}
inline char&String::operator[](int elem)
{
assert(elem<0&&elem>_size);
return _string[elem];
}
inline istream&
operator>>( istream &io, String &s )
{
// 人工限制最多4096 个字符
const int limit_string_size = 4096;
char inBuf[ limit_string_size ];
// setw()是iostream 库的一部分
// 限制被读取的字符个数为limit_string_size-1
io >> setw( limit_string_size ) >> inBuf;
s = inBuf; // String::operator=( const char* );
return io;
}
inline ostream&
operator<<( ostream& os, String &s )
{
return os << s.c_str();
}
//
//String.c
#include <iostream>
#include "String.h"
using std::endl;
using std::cin;
using std::cout;
int main()
{
int aCnt=0,eCnt=0,iCnt=0,oCnt=0,uCnt=0,theCnt=0,itCnt=0,wdCnt=0,notVowel=0;
String buf,the("the"),it("it");
while (cin>>buf){
++wdCnt;
cout<<buf<<' ';
if(wdCnt%12==0)
cout<<endl;
//
if (buf==the||buf=="The")
++theCnt;
else
if(buf==it||buf=="It")
++itCnt;
for (int ix=0;ix<buf.size();++ix)
switch(buf[ix])
{
case 'a':case 'A':++aCnt;break;
case 'e':case 'E':++eCnt;break;
case 'i':case 'I':++iCnt;break;
case 'o':case 'O':++oCnt;break;
case 'u':case 'U';++uCnt;break;
default:++notVowel;break;
}
//
cout <<"\n\n"
<<"words read:"<<wdCnt<<"\n\n"
<<"the/the:"<<theCnt<<'\n'
<<"it/It:"<<itCnt<<"\n\n"
<<"non-vowels reads:"<<notVowel<<"\n\n"
<<"a:"<<aCnt<<'\n'
<<"e:"<<eCnt<<'\n'
<<"i:"<<iCnt<<'\n'
<<"o:"<<oCnt<<'\n'
<<"u:"<<uCnt<<endl;
}
出现的错误:
------ Build started: Project: string, Configuration: Debug Win32 ------
Compiling...
String.cpp
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(52) : warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(112) : warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(125) : error C2143: syntax error : missing ';' before '&'
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(125) : error C2433: 'istream' : 'inline' not permitted on data declarations
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(125) : error C2501: 'istream' : missing storage-class or type specifiers
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(126) : error C2065: 'io' : undeclared identifier
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(126) : error C2065: 's' : undeclared identifier
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(126) : error C2275: 'String' : illegal use of this type as an expression
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(9) : see declaration of 'String'
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(126) : error C2501: 'operator`>>'' : missing storage-class or type specifiers
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(126) : error C2078: too many initializers
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(127) : error C2143: syntax error : missing ';' before '{'
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(127) : error C2447: '{' : missing function header (old-style formal list?)
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(137) : error C2143: syntax error : missing ';' before '&'
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(137) : error C2433: 'ostream' : 'inline' not permitted on data declarations
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(137) : error C2501: 'ostream' : missing storage-class or type specifiers
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(138) : error C2065: 'os' : undeclared identifier
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(138) : error C2275: 'String' : illegal use of this type as an expression
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(9) : see declaration of 'String'
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(138) : error C3861: 's': identifier not found, even with argument-dependent lookup
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(138) : error C2501: 'operator`<<'' : missing storage-class or type specifiers
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(138) : error C2078: too many initializers
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(139) : error C2143: syntax error : missing ';' before '{'
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(139) : error C2447: '{' : missing function header (old-style formal list?)
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.cpp(14) : error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'String' (or there is no acceptable conversion)
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.cpp(14) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Build log was saved at "file://e:\StuPractic\vc2003\C++primer\ch3\class\string\Debug\BuildLog.htm"
string - 22 error(s), 2 warning(s)
---------------------- Done ----------------------
Build: 0 succeeded, 1 failed, 0 skipped