我有一个MFC源文件,需要在Qt下编译。此文件使用MFC/ATL CString。具体来说,它使用一个CString作为iostream::open()的参数。我编写了一个CString类,它继承自QString,这样我就可以使用QStrings的大部分功能。
我主要担心的是,在调用iostream::open()的地方,我无法让我的CString实现工作:
这里有一些我的班级声明:
class CString : public QString {
public:
CString() : QString() {}
CString(const QString& other) : QString(other) {}
CString(const CString& other) : QString(other) {}
CString(_In_opt_z_ const XCHAR* pszSrc) : QString( pszSrc ) { *this = pszSrc; }
CString(const char* pszSrc) : QString( pszSrc ) {}
...
}下面是使用CString的一部分代码:
ofstream outfile;
CString Path("dump.txt");
outfile.open(Path);错误是:
没有调用'std::basic_ofstream >::open(CString&)‘的匹配函数
在“正常”的情况下,我只会做这样的事情:
outfile.open(Path.toStdString().c_str());然而,这不是一种选择。未授权对原始代码进行任何修改。:(
有办法做到这一点吗?还是我必须使用微软在cstringt.h t.h中使用的同样更复杂、更冗长的代码来重新构建类呢?
谢谢
发布于 2011-09-06 20:58:59
为您的CString类定义一个类型广播操作符如下:
operator const char*() { return this->toStdString().c_str(); }发布于 2011-09-06 20:55:43
根据这的说法,CString有一个重载的operator LPCTSTR,这就是在没有任何显式转换的情况下的工作方式。
我的猜测是,如果你想模仿这种行为,你需要提供类似的过载。LPCTSTR有点迟钝,所以operator const char *可能更好。
发布于 2011-09-06 21:02:40
首先,CString的正确设计是包装QString,而不是从它继承。毕竟,您只是在重新连接方法调用。
class CString {
public:
/* ... */
private:
QString internal;
};编译器抱怨没有为接受ofstream::open()参数而定义的CString方法。这意味着CString不是直接获取的(毕竟,ofstream是一个标准类)。您可以在类中编写强制转换,以便在需要时将其转换为char *。
class CString {
public:
/*...*/
operator const char *()
{
return internal.c_str();
}
private:
QString internal;
};这可能会解决问题。希望这能有所帮助。
https://stackoverflow.com/questions/7325993
复制相似问题