请教: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
...全文
375 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzgyb 2005-06-21
  • 打赏
  • 举报
回复
头文件中的istream, ostream, setw加上std::限定修饰符

#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 std::istream&
operator>>( std::istream &io, String &s )
{
// 人工限制最多4096 个字符
const int limit_string_size = 4096;
char inBuf[ limit_string_size ];
// setw()是iostream 库的一部分
// 限制被读取的字符个数为limit_string_size-1
io >> std::setw( limit_string_size ) >> inBuf;
s = inBuf; // String::operator=( const char* );
return io;
}
inline std::ostream&
operator<<( std::ostream& os, String &s )
{
return os << s.c_str();
}
tuqu 2005-06-21
  • 打赏
  • 举报
回复
该出错信息对应于
inline istream&
operator>>( istream &io, String &s )

“在※前面少了一个; ”请教“※”是指什么?
sunman1982 2005-06-20
  • 打赏
  • 举报
回复
missing ';' before '&'
就是这个啊,在※前面少了一个;
tuqu 2005-06-20
  • 打赏
  • 举报
回复
谢谢!
1、 String.cpp有#include <iostream >(开始时String.h;后面是String.cpp)
2、我写了using std::endl;
using std::cin;
using std::cout;
应该可以吧。
3、确实,冒号写成分号了 ^_^.
请教出错信息第三条怎么解释?
e:\StuPractic\vc2003\C++primer\ch3\class\string\String.h(125) : error C2143: syntax error : missing ';' before '&'
积木 2005-06-20
  • 打赏
  • 举报
回复
1.#include<iostream>

2.using namespace std;

3.case 'u':case 'U':++uCnt;break;

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧