在我的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'的成员
答案 0 :(得分:5)
因此,当您在标头中注释掉6参数构造函数时,会出现错误 - 但是包含调用到构造函数的源文件是相同的?是否有可能以某种方式将不同的头用于该编译(可能涉及预编译的头部怪异)。
尝试使用/showIncludes
选项(IDE的项目设置中的“C ++ |高级|显示包含”)和/或关闭预编译的标题,看看是否有任何进一步的线索或更好的行为。
答案 1 :(得分:1)
我的通灵调试功能认为EPSFault
没有定义你在那里使用它,或者这个类被包含在预编译头中(在这种情况下需要重建头)。
请注意,那里的代码没有异常安全,因为你在一个语句中放了两个new
- 如果第一个成功,第二个抛出std::bad_alloc
,那么分配的内存由第一个泄露。