对于operator + with class,C ++没有可接受的转换

时间:2017-11-07 22:41:13

标签: visual-c++ operator-overloading

我有一些已有15年历史的C ++代码,我试图将其带到更现代的时代。在这个阶段,我正在尝试使用Visual C ++ 6.0编译的代码现在使用VS 2003(Microsoft Visual C ++ .NET 69462-335-0000007-18915)进行编译。如果我们能够干净利落地进行编译运行正常,然后我们可以采取另一个步骤,使其进入更新版本的VS.但是我遇到了很多问题......

以下是(简化)代码的片段:

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'类型(或没有可接受的转换)的全局运算符

知道这段代码是如何运作的吗?如果我能找到它过去所做的事情,我可以开始定义重载的运算符+以匹配功能。

2 个答案:

答案 0 :(得分:0)

从多条评论中获取,尝试将公开转换运算符添加到class toS,如下所示:

operator LPCTSTR() const { return &buff[0]; }

您可能还需要在for循环中显式构造字符串,例如:

WriteBool(Section, CString("LineVis ") + static_cast<LPCTSTR>(LtoS(nLine++)), *vi);

旁注:您可能知道,因为您刚刚提取代码示例,这里存在问题:

std::vector<bool> BoolVect;

...

for (vi = BoolVect->begin(); vi != BoolVect->end(); vi++)

您用来访问BoolVect的符号表示它是一个指针,但在您的示例中并未将其声明为此。)

答案 1 :(得分:0)

当我使用以下命令从CString继承类时,编译器错误消失了:

class tos : public CString { ... }

希望这不仅会编译,而且会正确执行......