【发布时间】:2017-11-07 22:41:12
【问题描述】:
我有一些 15 年前的 C++ 代码,我正试图将它们带到更现代的时代。在这个阶段,我试图让用 Visual C++ 6.0 编译的代码现在用 VS 2003 (Microsoft Visual C++ .NET 69462-335-0000007-18915) 编译。如果我们可以让它干净地编译并正常运行,那么我们可以采取另一个步骤将它放入更新版本的 VS 中。但是我遇到了很多问题...
这是(简化的)代码的 sn-p:
class toS
{
public:
toS() { buff[0] ='\0'; }
operator LPCTSTR() { return buff; }
protected:
void Append (TCHAR c)
{
LPTSTR p = buff + _tcslen(buff);
*p++ = c;
*p = '\0';
}
TCHAR buff[40];
};
class LtoS : public toS
{
public:
LtoS(LONG n, TCHAR c = '\0')
{
_ltot(n, buff, 10);
Append(c);
}
};
void WriteBool(const CString& Section, const CString& Key, bool Value);
CString Section;
int nLine = 0;
std::vector<bool> *BoolVect;
std::vector<bool>::iterator vi;
...
for (vi = BoolVect->begin(); vi != BoolVect->end(); vi++)
WriteBool(Section, "LineVis " + LtoS(nLine++), *vi);
...
由此我收到以下错误消息:
错误 C2677:二进制“+”:未找到采用“LtoS”类型的全局运算符(或没有可接受的转换)
知道这段代码是如何工作的吗?如果我能找出它过去做了什么,我可以开始定义重载的 operator+ 以匹配功能。
【问题讨论】:
-
看来
LtoS既是一个类型又是一个在某处声明的函数。此处发布的信息可能不足以给出答案。 -
这不应该奏效。
-
然而 我似乎记得 VC++ 6 允许在不进行任何转换的情况下将
CString对象传递给printf,因为它的第一个成员变量是字符串,所以编译器以某种方式生成代码以隐式使用第一个成员。我什至似乎记得(ab)当时在我自己的代码中使用了类似的东西。这里可能会发生类似的事情。 -
LtoS是类的名字,所以也是构造函数的名字,这里貌似是函数调用。
标签: visual-c++ operator-overloading