【问题标题】:VC++ says "no overloaded function takes 7 arguments" I say YES IT DOES!VC++ 说“没有重载函数需要 7 个参数”我说是的!
【发布时间】:2010-08-16 19:47:57
【问题描述】:

在我的PDBComponent 类的头文件中,我刚刚为总共两个构造函数创建了一个新构造函数:

class PDBComponent {
    public:
        PDBComponent(string name,double min_current,double nom_current,
                     double max_current, EPSCommands* command_ptr, double delay);
        PDBComponent(string name,double min_current,double nom_current,
                     double max_current, EPSCommands* command_ptr, EPSFault* fault_ptr ,double delay);
...

当我使用第一个构造函数时,我没有得到任何编译错误。像这样:

PDBComponent component = PDBComponent("STX"     ,0.1,  0.5,  1.0
        ,new EPSCommands( 1.0, 3.0),0.0);

但是,当我使用第二个构造函数时,我得到一个编译错误::

PDBComponent component = PDBComponent("STX"     ,0.1,  0.5,  1.0
        ,new EPSCommands( 1.0, 3.0), new EPSFault(EPSFault::OpenCircuit,2.0),0.0);

编译错误:

错误 C2661: 'fs5system::PDBComponent::PDBComponent' : 没有重载函数需要 7 个参数

我想也许我正在使用一个头文件,而编译器正在查看另一个头文件,所以我注释掉了第一个构造函数。编译器显示它正在重新编译 PDBComponent.cpp 然后显示错误:

错误 C2511: 'fs5system::PDBComponent::PDBComponent(std::string,double,double,double,fs5system::EPSCommands *,double)' : 在 'fs5system::PDBComponent' 中找不到重载的成员函数

...这表明编译器确实在查看正确的头文件。

有人知道我为什么会看到这种行为吗?

我正在使用 Visual Studios C++ 进行编译。


更多线索:

我刚刚在头文件的类定义中添加了以下行:

bool trash() {return true;}

并用

对其进行了测试
PDBComponent* component;
component = new PDBComponent("STX"     ,0.1,  0.5,  1.0
        ,new EPSCommands( 1.0, 3.0),0.0);

cout << component->trash() << endl;

在我的主文件中。编译时,再次编译 PDBComponent 标头。我收到错误消息:

错误 C2039:“垃圾”:不是“fs5system::PDBComponent”的成员

【问题讨论】:

  • 当你注释掉第一个ctor时,你在第二次使用时是否仍然得到错误?
  • 这就是你所说的吗? (“STX”后面的空格是什么意思,为什么错误消息将“STX”称为std::string而不是?)
  • 你有没有尝试用一些假代码重现这个问题(空类,构造函数的空体采用 7 个参数与你的参数相似)?
  • 您是复制粘贴以上内容还是重新输入问题?
  • 我会去处理一些中间文件损坏。进行全面重建。

标签: c++ visual-c++ compiler-errors


【解决方案1】:

因此,当您在标头中将 6 参数构造函数注释掉时,您会在编译 6 参数构造函数时收到错误 - 但它是包含对构造函数的 调用 的同一源文件?是否有可能以某种方式在该编译中使用了不同的标头(可能涉及预编译标头的怪异)。

尝试使用/showIncludes 选项(IDE 项目设置中的“C++ | 高级 | 显示包含”)和/或关闭预编译头文件,看看是否有任何进一步的线索或更好的行为。

【讨论】:

  • 我正在尝试 /showIncludes...似乎包含很多...我认为您可能是赢家...敬请期待!
  • 那么问题到底出在哪里?
  • 通过 /showIncludes 输出查找特定标题的名称可能会很快为您带来好结果...
  • 我们有一个赢家!非常感谢。今天早上我对我的项目进行了很多重构,在这个过程中我有重复的文件想知道。虽然我认为我的解决方案资源管理器中的文件都指向新目录,但有些仍然指向旧目录,所以我编辑的文件与我想象的不同。 /showIncludes 指出了这一点。 (在我的 c++ 工具箱中插入 /showIncludes。)
【解决方案2】:

我的心理调试能力认为EPSFault 没有定义在你在那里使用它的地方,或者这个类被包含在预编译的头文件中(在这种情况下,需要重新构建头文件)。

请注意,代码不是异常安全的,因为您在单个语句中放置了两个 news - 如果第一个成功,第二个抛出 std::bad_alloc,那么第一个分配的内存是泄露了。

【讨论】:

  • +1 对于“异常安全”的评论。我是 C++ 新手,今天我真的感觉到了 GOTCHAS!
  • 如果你能告诉我在哪里可以获得通灵调试器,我会再给你一个 +1。
  • @John:他的名字叫 Raymond Chen。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
相关资源
最近更新 更多