【问题标题】:C++ no acceptable conversion for operator+ with classC++ 对带有类的 operator+ 没有可接受的转换
【发布时间】: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


【解决方案1】:

当我使类 tos 从 CString 继承时,编译器错误消失了:

class tos : public CString { ... }

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

【讨论】:

    【解决方案2】:

    从几个 cmets 派生,尝试将公共转换运算符添加到 class toS,如下所示:

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

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

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

    (旁注:您可能知道,因为您刚刚提取了示例代码,所以这里有一个问题:

    std::vector&lt;bool&gt; BoolVect;

    ...

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

    您用于访问 BoolVect 的符号暗示它是一个指针,但在您的示例中并未如此声明。)

    【讨论】:

    • 哎呀 - 很好 @Phil Brubaker,我搞砸了代码 sn-p 的提取。在原始问题中修复它...
    • 我也忘了包含运算符 LPCTSTR() 的定义,现在已添加到原始问题中。
    • 啊这样算子已经存在了?我会稍微更新我的答案。
    猜你喜欢
    • 2012-11-20
    • 2013-08-17
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    相关资源
    最近更新 更多