我已经阅读了以下链接中的所有建议
但仍无法找到问题的解决方案:
我需要构造一个
对象的函数内部class A
的对象(其构造函数期望作为输入 参数是该类的枚举类型)来自class B
以下是代码段:
档案A.h:
Class A{
public:
enum FileType{TEXT, BIN};
/*! This constructor initializes the data from a given file
* (binary, text, image).
*/
A(const std::string& filename, FileType type);
}
档案A.cpp:
A::A(const std::string& filename, FileType type){
...
}
档案B.h:
Class B{
private:
A objectOfClassA;
public:
enum FileType{TEXT = A::FileType::TEXT, BIN = A::FileType::BIN}; //<----THIS IS NOT WORKING!
foo_func(const std::string& filename, FileType type);
}
档案B.cpp:
void B::foo_func(const std::string& filename, FileType type){
this->objectOfClassA(filename, type); //should construct an object of class A
... //do stuff with objectOfClassA
}
文件main.cpp:
int main(int argc, char** argv) {
B objectOfClassB;
objectOfClassB.foo_func("file_path", foo_func.TEXT);
}
通过尝试运行主程序,我在函数foo_func
的 B.cpp 文件中的编译器中收到此错误:
无法拨打'(A) (std :: basic_string,B :: FileType&amp;)'
这意味着我没有使用正确的枚举类型来调用A class
构造函数,但是如何解决这个问题?
我做错了什么?
答案 0 :(得分:6)
B::FileType
和A::FileType
是不同的类型。您需要在B内部typedef A::FileType FileType
正确别名类型,以便它们可以互换。否则B::FileType
是一个枚举,结构上与A::FileType
相同,但在类型系统中不相关。这回答了您的主要问题。
但是,修复此问题仍然不允许编译代码,这不是错误所抱怨的内容。
objectOfClassA已在foo_func中构造。调用this->objectOfClassA(filename, type)
是尝试在对象上使用overloaded()运算符;此运算符不存在,因此代码无法编译。您只能使用初始化符号表示构造函数来构造objectOfClassA,例如
B::B(const std::string& filename, FileType type) : objectOfClassA(filename, type)
{
...
}
然后在main中你会这样做:
B objectOfClassB("file_path", B::TEXT);
在调试器中逐步查看控制流程。