【问题标题】:error: cannot convert ‘std::string’ to ‘char’ in assignment [closed]错误:无法在赋值中将“std::string”转换为“char”[关闭]
【发布时间】:2013-07-02 16:21:55
【问题描述】:

我有一个称为 shell 脚本的可执行文件:

./lineGraph argv[1] argv[2] ... argv[9]

它创建了一个 lineGraph 类的实例(代码在这里大大简化了):

class lineGraph
{
  string z[3];

  lineGraph(string lumi, string label, char *typeArg, string volume, string axisStyle, string theLine, string z1, string z2, string z3)
  {
    this->z[0]=z1;
    this->z[1]=z2;
    this->z[2]=z3;
  }
}

public int main(int argc, char* argv[])
{
  lineGraph *graphData = new lineGraph(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]);
};

我得到:

lineGraph.cc:251: error: cannot convert ‘std::string’ to ‘char’ in assignment
lineGraph.cc:252: error: cannot convert ‘std::string’ to ‘char’ in assignment
lineGraph.cc:253: error: cannot convert ‘std::string’ to ‘char’ in assignment

这里:

this->z[0]=z1;
this->z[1]=z2;
this->z[2]=z3;

我很好奇解决方案,以及为什么它给我一个错误的解释(我正在将 string[] 的一个元素设置为一个字符串,我认为这是允许的)。我可能缺少一些基本的东西,因为我的 C++ 生锈了。

提前致谢!

编辑:问题已解决。是一个偷偷摸摸的变量声明覆盖了 z[] 声明。

【问题讨论】:

  • 请贴出真实代码。 argv 没有在上面的main 中声明。
  • 好吧,首先,argv 不存在。这就是我们知道这个测试用例是无稽之谈的方式。向我们展示您的真实代码;您一直在调试的代码;您尝试编译的代码。实际上包含错误的代码。
  • 只是一个猜测,但您的真实代码中的z 可能被声明为字符串而不是字符串数组。发布您的真实代码,您将获得真正的解决方案。
  • (code simplified tremendously here) 做得很好,但您确实应该在进行最终调试之前完成它,而且您绝对应该在发布之前对其进行测试!它使问题消失(并引入了一个新问题)。
  • 你为什么没有lineGraph graphData(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]);

标签: c++ string char


【解决方案1】:

代码中有几个错误:

  1. 类声明后缺少;
  2. argv 没有声明,你应该写int main(int argc, char *argv[])
  3. 类的构造函数是私有的(应该是公共的)。

但在更正这些错误后,代码编译得很好。没有任何cannot convert std::string to char 错误。

可能您正在尝试编译不同的东西,而不是您向我们展示的代码。

【讨论】:

    【解决方案2】:

    我能够重现您遇到的错误的唯一方法是将 z 更改为单个 string 而不是字符串数组。下面的示例产生的结果与您得到的结果相同

    class lineGraph
    {
        string z;
    
    public:
        lineGraph(string lumi, string label, char * /*typeArg*/, string volume, string axisStyle, string theLine, string z1, string z2, string z3)
        {
            this->z[0]=z1;
            this->z[1]=z2;
            this->z[2]=z3;
        }
    };
    

    这会在 VS2010 上产生以下结果。根据您使用的工具链,错误代码可能会略有不同。

    main.cpp(587):错误 C2440:“=”:无法从“std::string”转换为“char”
    1> 没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符
    1>main.cpp(588): 错误 C2440: '=' : 无法从 'std::string' 转换为 'char'
    1> 没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符
    1>main.cpp(589): 错误 C2440: '=' : 无法从 'std::string' 转换为 'char'
    1> 没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符

    仔细检查您的实际代码并确保 z 被贴花为像这样的数组

    class lineGraph
    {
        string z[3];
    
        // ...more REAL code...
    };
    

    【讨论】:

    • 这解决了这个问题:我有一个偷偷摸摸的“字符串 z”隐藏在某个地方,覆盖了“字符串 z[]”。
    猜你喜欢
    • 2017-02-12
    • 1970-01-01
    • 2016-06-10
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多