使用另一个类的枚举类型

Mat*_*teo 2 c++ enums class

我已经阅读了以下链接中的所有建议

  1. c ++ typedef另一个类的枚举?
  2. http://forums.devarticles.com/cc-help-52/how-to-use-enum-when-it-is-in-another-class-17773.html
  3. http://forums.codeguru.com/showthread.php?t=435215
  4. 如何在代码的另一部分中使用类中的Enum值?

但仍然无法找到我的问题的解决方案:

我需要构建一个对象class A(其构造函数期望作为输入参数,该类的枚举类型)来自对象的一个​​函数内部.class B

以下是代码段:

文件啊:

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);

}
Run Code Online (Sandbox Code Playgroud)

文件A.cpp:

A::A(const std::string& filename, FileType type){
 ...
}
Run Code Online (Sandbox Code Playgroud)

文件Bh:

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);

}
Run Code Online (Sandbox Code Playgroud)

文件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
}
Run Code Online (Sandbox Code Playgroud)

文件main.cpp:

int main(int argc, char** argv) {

    B objectOfClassB;
    objectOfClassB.foo_func("file_path", foo_func.TEXT);

}
Run Code Online (Sandbox Code Playgroud)

通过尝试运行主程序,我在函数行的B.cpp文件中从编译器得到此错误foo_func:

调用'(A)(std :: basic_string,B :: FileType&)'不匹配

这意味着我没有使用正确的枚举类型来调用A class构造函数,但我该如何解决这个问题呢?

我究竟做错了什么?

小智 6

B::FileType并且A::FileType是不同的类型.您需要typedef A::FileType FileType在B内部对类型进行正确别名,以便它们可以互换.否则B::FileType是一个枚举,它在结构上与A::FileType类型系统相同但不相关.这回答了您的主要问题.

但是,修复此问题仍然不允许编译代码,这不是错误所抱怨的内容.

objectOfClassA已经在foo_func中构造.调用this->objectOfClassA(filename, type)是尝试在对象上使用overloaded()运算符; 此运算符不存在,因此代码无法编译.您只能使用初始化符号表示构造函数来构造objectOfClassA,例如

B::B(const std::string& filename, FileType type) : objectOfClassA(filename, type)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后在main中你会这样做:

B objectOfClassB("file_path", B::TEXT);
Run Code Online (Sandbox Code Playgroud)

在调试器中单步执行以查看控制流.