重载用户定义类型的运算符(非类!) [英] Overloading Operators for User-Defined Types (NOT Classes!)
问题描述
有没有办法覆盖用户定义类型的运算符
(例如,typedef)而不是类类型?
我正在尝试覆盖用户定义的
枚举类型的提取器操作符,但没有得到快乐。例如,
typedef enum {SUN,MON,TUES,WED,THURS,FRI,SAT}周;
istream&运营商GT;> (istream& is,WEEK& x)
{
x =等等等等;
返回是;
}
--RY
Randy写道:有没有办法覆盖用户定义类型的运算符
(例如,typedef)而不是类类型?
''typedefs''是_not_用户定义的类型。
我试图覆盖用户定义的提取器运算符
枚举类型,但没有得到快乐。例如,
typedef enum {SUN,MON,TUES,WED,THURS,FRI,SAT}周;
istream&运营商GT;> (istream& is,WEEK& x)
{
x =等等等等;
返回;
}
FAQ 5.8。除了''blah blah'',代码应该没问题。
V
#include< string>
#include< iostream>
#include< sstream>
使用namespace :: std
#include < stdint.h>
typedef enum {SUN,MON,TUE,WED,THU,FRI,SAT}周;
#定义MAXCHARS_IN_ALINE 256
istream&运营商GT;> (istream& is,WEEK& x)
{
char aline [MAXCHARS_IN_ALINE];
is.getline(aline, MAXCHARS_IN_ALINE;
if(((string)aline).find(" SUN",0)!= string :: npos)
{
x = SUN;
返回;
}
if(((string)aline)。 find(" MON",0)!= string :: npos)
{
x = MON;
return is;
}
if(((string)aline).find(" TUE",0)!= string :: npos)
{
x = TUE;
返回;
}
if(((string )aline).find(" WED",0)!= string :: npos)
{
x = WED;
返回是;
}
if(((string)aline).find(" THU",0)!= string :: npos)
{
x = THU;
返回;
}
如果(((string)aline).find(" FRI",0)!= string :: npos)
{
x = FRI;
返回是;
}
if(((string)aline).find(" SAT",0)!= string: :npos)
{
x = SAT;
返回是;
}
>
x = MON;
返回;
}
int main(int argc,char ** argv )
{
string strTest;
周周;
strTest =" THU" ;
istringstream(strTest)>>一周;
cout<< (uint16_t)周;
返回0;
}
产生以下错误:
make -f over.mak TARGET = native PLATFORM = linux
DSPROOT_DIR = / home / yates / modetest /
over.mak:101:no 'include'的文件名''
为应用程序构建自动开发(over)
over.mak:101:没有'include''的文件名
申请建筑构件(上)
/home/yates/modetest/host/app/modetest/over.cpp:7:错误:预期`;''
之前的typedef
/home/yates/modetest/host/app/modetest/over.cpp:在功能中
`std :: istream&运算符>>(std :: istream&,WEEK&)'':
/home/yates/modetest/host/app/modetest/over.cpp:15:错误:预期`)' '
之前'';''令牌
/home/yates/modetest/host/app/modetest/over.cpp:在函数`int
main(int,char **)'':
/home/yates/modetest/host/app/modetest/over.cpp:69:错误:不匹配
''运算符>>''in''istringstream(((const std :: basic_string< char,
std :: char_traits< char> ;, std :: allocator< char> >&)((const
std :: basic_string< char,std :: char_traits< char> ;,std :: allocator< char>*)(& ; strTest))),_ S_in)>>周''
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4。 3 / bits / istream.tcc:87:
注意:候选人是:std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT,
_Traits> :: operator>>(std :: basic_istream< _CharT,
_Traits>&(*)(std :: basic_istream< _CharT,_Traits>& ))[与_CharT =
char,_Traits = std :: char_traits< char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3 /../../../../include/c++/3.4.3/bits/istream.tcc:93:
注意:std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT,_Traits> :: operator>>(std :: basic_ios< _CharT,
_Traits>&(*)(std :: basic_ios< _CharT,_Traits>&))[with _CharT = char,
_Traits = std :: char_traits< char>]
/ usr / lib / gcc / i386 -redhat-linux / 3.4.3 /../../../../ include / c ++ / 3.4.3 / bits / istream.tcc:102:
note:std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT,
_Traits> :: operator>>(std :: ios_base& ;(*)(std :: ios_ba se&))[with _CharT =
char,_Traits = std :: char_traits< char>]
/ usr / lib / gcc / i386-redhat-linux / 3.4.3 /../../../../ include / c ++ / 3.4.3 / bits / istream.tcc:111:
注意: std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT,_Traits> :: operator>>(bool&)[with _CharT =
char,_Traits = std :: char_traits< char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include /c++/3.4.3/bits/istream.tcc:133:
注意:std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT ,_Traits> :: operator>>(short int&)[with
_CharT = char,_Traits = std :: char_traits< char>]
/ usr / lib /gcc/i386-redhat-linux/3.4.3/../../../ ../include/c++/3.4.3/bits/istream.tcc:164:
注意:std :: basic_istream< _CharT,_Traits>&
std: :basic_istream< _CharT,_Traits> :: operator>>(short unsigned int&)
[with _CharT = char,_Traits = std :: char_traits< char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:186:
注意:std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT,_Traits> :: operator>>(int&)[with _CharT =
char,_Traits = std :: char_traits< char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../。 ./../include/c++/3.4.3/bits/istream.tcc:217:
注意:std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT,_Traits> :: operator>>(unsigned int&)[with
_CharT = char,_Traits = std :: char_traits< char>]
/ usr / lib / gcc / i386-redha t-linux / 3.4.3 /../../../../ include / c ++ / 3.4.3 / bits / istream.tcc:239:
注意:std :: basic_istream< ; _CharT,_Traits>&
std :: basic_istream< _CharT,_Traits> :: operator>>(long int&)[with _CharT
= char,_Traits = std :: char_traits< char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/ 3.4.3 / bits / istream.tcc:261:
注意:std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT,_Traits> :: operator>>(long unsigned int&)
[with _CharT = char,_Traits = std :: char_traits< char>]
/ usr / lib / gcc /i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:284:
note:std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT,_Traits> :: operator>>(long long int&)[with
_CharT = char,_ Traits = std :: char_traits< char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3 /../../../../ include / c ++ / 3.4.3 / bits / istream.tcc:306:
注意:std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT,_Traits> :: operator>>(long long unsigned
int&)[with _CharT = char,_Traits = std :: char_traits< char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/。 ./../../../include/c++/3.4.3/bits/istream.tcc:329:
注意:std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT,_Traits> :: operator>>(float&)[with _CharT =
char,_Traits = std :: char_traits< char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc: 351:
注意:std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT,_Traits> :: operator>>(double&) [与_CharT =
char,_Traits = std :: char_tra它的< char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/ bits / istream.tcc:373:
注意:std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT,_Traits> :: operator> >(long double&)[with
_CharT = char,_Traits = std :: char_traits< char>]
/ usr / lib / gcc / i386-redhat- linux / 3.4.3 /../../../../ include / c ++ / 3.4.3 / bits / istream.tcc:395:
注意:std :: basic_istream< _CharT ,_Traits>&
std :: basic_istream< _CharT,_Traits> :: operator>>(void *&)[with _CharT =
char,_Traits = std :: char_traits< char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4 .3 / bits / istream.tcc:417:
注意:std :: basic_istream< _CharT,_Traits>&
std :: basic_istream< _CharT,
_Traits> :: operator>>(std :: basic_streambuf< _CharT,_Traits> *) [with
_CharT = char,_Traits = std :: char_traits< char>]
/home/yates/modetest/host/app/modetest/over.cpp:12 :注意:
std :: istream&运算符>>(std :: istream&,WEEK&)
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../ .. /include/c++/3.4.3/istream:692:
note:std :: basic_istream< char,_Traits>&
std :: operator>>( std :: basic_istream< char,_Traits>& ;, signed char *)[with
_Traits = std :: char_traits< char>]
/ usr / lib / gcc /i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/istream:687:
note:std :: basic_istream< char,_Traits>&
std :: operator>>(std :: basic_istream< char,_Traits>& ;, unsigned char *)
[with _Traits = std :: char_traits< char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4 .3 / istream:651:
注意:std :: basic_istream< char,_Traits>&
std :: operator>>(std :: basic_istream< char ,_Traits>& ;, signed char&)[with
_Traits = std :: char_traits< char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/istream: 646:
注意:std :: basic_istream< char,_Traits>&
std :: operator>>(std :: basic_istream< char,_Traits>& ,unsigned char&)
[with _Traits = std :: char_traits< char>]
make:*** [/ home / yates / modetest / host / app / modetest / nativelinux / over.o]
错误1
编译在1月4日星期三16:27:23 > <代码2异常退出br />
> ''typedefs''是_not_用户定义的类型。
为什么不呢?!!!它们定义了不内置的类型,因此它们是用户b $ b $
--RY
Is there a way to override operators for user-defined types
(e.g., typedefs) rather than class types?
I''m trying to override the extractor operator for a user-defined
enumeration type but getting no joy. For example,
typedef enum {SUN,MON,TUES,WED,THURS,FRI,SAT} WEEK;
istream& operator>> (istream& is, WEEK& x)
{
x = blah blah;
return is;
}
--RY
Randy wrote:Is there a way to override operators for user-defined types
(e.g., typedefs) rather than class types?
''typedefs'' are _not_ user-defined types.
I''m trying to override the extractor operator for a user-defined
enumeration type but getting no joy. For example,
typedef enum {SUN,MON,TUES,WED,THURS,FRI,SAT} WEEK;
istream& operator>> (istream& is, WEEK& x)
{
x = blah blah;
return is;
}
FAQ 5.8. Aside from ''blah blah'', the code should be fine.
V
#include <string>
#include <iostream>
#include <sstream>
using namespace::std
#include <stdint.h>
typedef enum {SUN,MON,TUE,WED,THU,FRI,SAT} WEEK;
#define MAXCHARS_IN_ALINE 256
istream& operator>> (istream& is, WEEK& x)
{
char aline[MAXCHARS_IN_ALINE];
is.getline(aline, MAXCHARS_IN_ALINE;
if (((string)aline).find("SUN", 0) != string::npos)
{
x = SUN;
return is;
}
if (((string)aline).find("MON", 0) != string::npos)
{
x = MON;
return is;
}
if (((string)aline).find("TUE", 0) != string::npos)
{
x = TUE;
return is;
}
if (((string)aline).find("WED", 0) != string::npos)
{
x = WED;
return is;
}
if (((string)aline).find("THU", 0) != string::npos)
{
x = THU;
return is;
}
if (((string)aline).find("FRI", 0) != string::npos)
{
x = FRI;
return is;
}
if (((string)aline).find("SAT", 0) != string::npos)
{
x = SAT;
return is;
}
x = MON;
return is;
}
int main(int argc, char **argv)
{
string strTest;
WEEK week;
strTest = "THU";
istringstream(strTest) >> week;
cout << (uint16_t)week;
return 0;
}
yields the following slurry of errors:
make -f over.mak TARGET=native PLATFORM=linux
DSPROOT_DIR=/home/yates/modetest/
over.mak:101: no file name for `include''
Building Autodependencies (over) for Application over
over.mak:101: no file name for `include''
Building Component (over) for Application over
/home/yates/modetest/host/app/modetest/over.cpp:7: error: expected `;''
before "typedef"
/home/yates/modetest/host/app/modetest/over.cpp: In function
`std::istream& operator>>(std::istream&, WEEK&)'':
/home/yates/modetest/host/app/modetest/over.cpp:15: error: expected `)''
before '';'' token
/home/yates/modetest/host/app/modetest/over.cpp: In function `int
main(int, char**)'':
/home/yates/modetest/host/app/modetest/over.cpp:69: error: no match for
''operator>>'' in ''istringstream(((const std::basic_string<char,
std::char_traits<char>, std::allocator<char> >&)((const
std::basic_string<char, std::char_traits<char>, std::allocator<char>*)(&strTest))), _S_in) >> week''
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:87:
note: candidates are: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT,
_Traits>::operator>>(std::basic_istream<_CharT,
_Traits>&(*)(std::basic_istream<_CharT, _Traits>&)) [with _CharT =
char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:93:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(std::basic_ios<_CharT,
_Traits>&(*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char,
_Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:102:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT,
_Traits>::operator>>(std::ios_base&(*)(std::ios_ba se&)) [with _CharT =
char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:111:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT =
char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:133:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(short int&) [with
_CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:164:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int&)
[with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:186:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(int&) [with _CharT =
char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:217:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(unsigned int&) [with
_CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:239:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(long int&) [with _CharT
= char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:261:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(long unsigned int&)
[with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:284:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(long long int&) [with
_CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:306:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(long long unsigned
int&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:329:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(float&) [with _CharT =
char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:351:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(double&) [with _CharT =
char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:373:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(long double&) [with
_CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:395:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT, _Traits>::operator>>(void*&) [with _CharT =
char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/istream.tcc:417:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT,
_Traits>::operator>>(std::basic_streambuf<_CharT, _Traits>*) [with
_CharT = char, _Traits = std::char_traits<char>]
/home/yates/modetest/host/app/modetest/over.cpp:12: note:
std::istream& operator>>(std::istream&, WEEK&)
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/istream:692:
note: std::basic_istream<char, _Traits>&
std::operator>>(std::basic_istream<char, _Traits>&, signed char*) [with
_Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/istream:687:
note: std::basic_istream<char, _Traits>&
std::operator>>(std::basic_istream<char, _Traits>&, unsigned char*)
[with _Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/istream:651:
note: std::basic_istream<char, _Traits>&
std::operator>>(std::basic_istream<char, _Traits>&, signed char&) [with
_Traits = std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/istream:646:
note: std::basic_istream<char, _Traits>&
std::operator>>(std::basic_istream<char, _Traits>&, unsigned char&)
[with _Traits = std::char_traits<char>]
make: *** [/home/yates/modetest/host/app/modetest/nativelinux/over.o]
Error 1
Compilation exited abnormally with code 2 at Wed Jan 4 16:27:23
> ''typedefs'' are _not_ user-defined types.
Why not?!!! They define types that aren''t built-in, so they''re
user.
--RY
这篇关于重载用户定义类型的运算符(非类!)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!