重载用户定义类型的运算符(非类!) [英] Overloading Operators for User-Defined Types (NOT Classes!)

查看:94
本文介绍了重载用户定义类型的运算符(非类!)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法覆盖用户定义类型的运算符

(例如,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&qu​​ot;,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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆