VC ++说“没有重载函数需要7个参数”我说是的!

时间:2010-08-16 19:47:58

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

在我的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:'trash':不是'fs5system :: PDBComponent'的成员

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

我的通灵调试功能认为EPSFault没有定义你在那里使用它,或者这个类被包含在预编译头中(在这种情况下需要重建头)。

请注意,那里的代码没有异常安全,因为你在一个语句中放了两个new - 如果第一个成功,第二个抛出std::bad_alloc,那么分配的内存由第一个泄露。