【问题标题】:Return type object methods返回类型对象方法
【发布时间】:2012-05-04 14:15:19
【问题描述】:

如果我有这个泛型方法,其中使用派生自 string s 的参数返回类型 Foo 对象:

Foo createFoo(string s)
{
    int index, first, second, third, fourth, fifth;

    Foo fooName(int first, int second,int third,int fourth,int fifth);
    return fooName;
}

然后在 main 中,我尝试做这样的事情:

Foo newFoo = createFoo(argv[2]);

为什么编译器会给我这个错误?

file.cc:30:1:错误:'Foo' 没有命名类型 file.cc:在函数中 'int main(int,char**)':file.cc:180:38:错误:'createFoo'不是 在此范围内声明

来自 Java,做这样的事情通常不会给我带来任何问题,为什么这在 C++ 中会成为问题?我该如何解决这个问题?

编辑 1: 一些建议询问我的Foo 类定义在哪里。它位于createFoo 方法之后,所以我将createFoo 方法移到Foo 类定义代码段之后并尝试编译。 现在出现一个新错误:

file.cc:在函数‘Foo createFoo(std::string)’中:file.cc:153:9: 错误:从“Foo (*)(int, int, int, int, int)” 转换为 请求的非标量类型“Foo”

【问题讨论】:

  • 您是否将Foo 的定义添加到您的主源文件中?
  • 你在哪里定义了 Foo?如果是在 createFoo 方法之后,那么在之前。
  • Foo 的类定义位于同一个 .cc 文件中。事实上,目前所有内容都位于同一个文件中。

标签: c++ class methods initialization


【解决方案1】:

您没有包含定义“Foo”的标头,或者您忘记添加 using 指令以将其从定义它的命名空间中拉入。

【讨论】:

    【解决方案2】:

    声明return fooName;是返回函数fooName,我想你打算返回函数调用的结果,应该是return fooName(first, second, third, fourth, fifth);之类的东西

    【讨论】:

      【解决方案3】:

      Mert 对我的方法位置的质疑是正确的。方法代码块应该位于文件中的 Foo 类定义位置之后。

      【讨论】:

        【解决方案4】:

        关于你的第二个错误,转换一个:

        Foo fooName(int first, int second,int third,int fourth,int fifth);
        

        您打算创建新的对象实例,将一些参数传递给对象构造函数。但相反,您最终声明了一个新函数。从参数中删除类型名称(“int”)以解决此问题。

        您还应该知道the most vexing parse

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-19
          • 2015-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多