提问者:小点点

使用枚举的嵌套名称说明符中使用的类型不完整


在StackOverflow上已经有了一些关于这个问题的答案,但是没有一个对我有效。

我有一个文件.h,其中声明了一些常量:

#ifndef CONVENZIONI_GERARCHIA_H
#define CONVENZIONI_GERARCHIA_H

namespace Conv{
    enum Linguaggio : short;
    enum Libreria : short;
    ...
}

#endif

然后是定义它们的.cpp文件:

#include "models/support/Convenzioni.h"

namespace Conv{
   enum Libreria : short{
       BOOTSTRAP = 0,
       JQUERY = 1,
       TREEJS = 2,
       ANGULAR = 3,
       VUEJS = 4
   };
   enum Linguaggio :short {
        PYTHON = 0,
        JAVA = 1,
        PHP = 2,
        CPP = 3,
        SWIFT = 4,
        JAVASCRIPT = 5,
        RUBY = 6,
        SQL =7,
        TYPESCRIPT =8
   };  
   const double coeff_liquidazione{0.889};
   const double perc_remunerazione{0.8};
   const unsigned int soglia_anni_esperto{20}; 
   ...
}

但是,当我尝试使用这些枚举时,我得到错误:“Python”不是“conv::Linguaggio”的成员,还得到错误:嵌套名称说明符中命名的不完整类型“conv::Linguaggio”

我在这个文件中使用它:

#ifndef CONTROLLER_H
#define CONTROLLER_H

#include "models/support/Convenzioni.h"
#include ...
class Controller : public QObject
{
    Q_OBJECT
    Gestionale* view;

    std::vector<Employee*> getEmployee() const{
        
        auto _ = Conv::Linguaggio::PYTHON;
//               ^^^^^^^^^^^^^^^^^^^^^^^^-------- error here
        return {};
    }
public:
    ...

signals:

};

#endif // CONTROLLER_H

…我错过了什么? 在.cpp上定义的所有其他常量都可以正常工作

更新:
如果我将枚举粘贴到.h中,它们可以正常工作


共1个答案

匿名用户

我错过了什么? 在。cpp上定义的所有其他常量都可以正常工作

变量不同于类型。 如果只有变量的声明对某个.cpp文件可见,那么链接器将在链接程序时找到适当的定义。 (假设你没有违反ODR)。

但是enum是一种类型,类型的定义必须对需要定义的每个翻译单元都是可见的。 您基本上必须在头文件中定义枚举