关于operator string()和operator char*()在调用的时候冲突的编译错误,高手请帮忙一下,谢谢!

yongxuefeng 2005-10-17 03:17:30
我的编译环境是:Windows 下的g++,即eclipse + CDT + MinGW环境,我是做代码移植的,最近碰到一个VC能编译通过,但GCC 3.2.3不能通过的问题,我用一个工程(eclipse工程,两个文件),这两个文件如下:

/* xml_str.h */
#ifndef XML_STR_H_
#define XML_STR_H_

#include <iostream>
#include <string>

using namespace std;

namespace fengxueyong
{

class MsgStr
{
public:

MsgStr()
{
s_str = " This is a string string";
std::cout<< "default constructor!\n";
}

MsgStr(std::string& str)
{
s_str = str;
std::cout<< " string constructor!\n";
}

MsgStr(const char * const cstr)
{
std::cout<< " char constructor!\n";
}



operator const char*() const
{
return char_str;
}

operator std::string() const
{
return s_str;
}


~MsgStr()
{
std::cout<<"XmlStr destructor\n";
}

private:

char* char_str;
std::string s_str;
};

} /* end of namespace fengxueyong */

#endif /*XML_STR_H_*/



/* xml_str.cpp */
#include <iostream>
#include "xml_str.h"

using namespace fengxueyong;

int main()
{
const char* charp = "This is a char*";
std::string a_string = "This is a string";

charp = (const char*)MsgStr(charp); // no error here
a_string = (std::string)MsgStr(a_string); // <==== g++ compiler error here

std::cout<< charp << std::endl;
std::cout<< a_string << std::endl;

}


用windows下的VC编译通过,但是用windows下的g++(MinGW)编译出错如下:


**** Full rebuild of configuration Debug for project XmlStr ****

make -k clean all
rm -rf ./xml_str.o ./xml_str.d XmlStr.exe
process_begin: CreateProcess((null), rm -rf ./xml_str.o ./xml_str.d XmlStr.exe, ...) failed.
make (e=2): 系统找不到指定的文件。

make: [clean] Error 2 (ignored)
' '
'Building file: ../xml_str.cpp'
'Invoking: GCC C++ Compiler'
g++ -O3 -Wall -c -fmessage-length=0 -oxml_str.o ../xml_str.cpp
../xml_str.cpp: In function `int main()':
../xml_str.cpp:12: error: call of overloaded `basic_string(fengxueyong::MsgStr)' is ambiguous
D:/MinGW/include/c++/3.4.2/bits/basic_string.tcc:224: note: candidates are: std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
D:/MinGW/include/c++/3.4.2/bits/basic_string.tcc:181: note: std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
make: *** [xml_str.o] Error 1
make: Target `all' not remade because of errors.
Build complete for project XmlStr


现在肯定的是operator std::string() 和operator const char*()两个函数引起了冲突,但是用charp = (const char*)MsgStr(charp); 就没有错误,用a_string = (std::string)MsgStr(a_string); 就是有错。如果把两个运算符函数注释掉一个,一切OK,但是项目代码中大量有这样的用法,现在就是如何进行调用才能不让g++有这个错误,只要是保留这两个函数都可以,谢谢!!
急用,谁解决油高分送。
...全文
290 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yongxuefeng 2005-10-18
  • 打赏
  • 举报
回复
fangrk(加把油,伙计!) ,多谢,按照你的方法是可行的,编译通过的,非常感谢!
K 2005-10-17
  • 打赏
  • 举报
回复
GZ
v41dugu 2005-10-17
  • 打赏
  • 举报
回复
搞不懂。。。。。
doway 2005-10-17
  • 打赏
  • 举报
回复
mark
kunp 2005-10-17
  • 打赏
  • 举报
回复
决定不看了,乱七八糟。
fangrk 2005-10-17
  • 打赏
  • 举报
回复
不知道这样行不行:

charp = MsgStr(charp).operator const char*();
a_string = MsgStr(a_string).operator std::string();

如果可以的话,定义一个宏可以简化一下代码

不过这个MsgStr设计的太糟糕了

64,637

社区成员

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

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