You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++ Logger类测试报错:表达式需为类类型、枚举类型不允许

解决你的Logger类编译错误问题

我来帮你分析并修复这两个编译错误:

错误1:向函数传递枚举时提示"type Not allowed"

你在调用log方法时的枚举值写法存在问题:

logger.log(Logger::LogLevel ERROR, "test ERROR");

这里Logger::LogLevel是枚举的类型名称,ERROR是该类型下的具体枚举值。正确的写法应该直接使用枚举值的限定名,不需要重复声明类型。也就是说,要写成Logger::ERROR,而不是Logger::LogLevel ERROR——后者相当于你试图在函数参数位置声明一个变量,这在函数调用的语境下是完全不允许的。

错误2:"expression must have a class type"

这个错误其实是第一个错误引发的连锁问题。当你错误地写Logger::LogLevel ERROR作为参数时,编译器会把它解析成一个变量声明,而非合法的函数参数表达式,这直接打乱了编译器对logger.log(...)语句的解析逻辑,导致它无法识别logger是一个类实例。只要修复第一个错误,这个问题会自动消失。

额外的小优化

另外,你在构造函数里的if (Errorlevel <= INFO)判断可能不符合预期——枚举值默认的整数映射是从0开始的:ALL=0INFO=1WARNING=2ERROR=3NEEDED=4。所以这个判断只会在级别是ALLINFO时触发初始化日志,如果你想在设置任何级别时都打印初始化信息,可以去掉这个条件判断。

修正后的完整代码

#include <iostream>
#include <string>
using std::string;
using std::cout;

class Logger {
public:
    enum LogLevel { ALL, INFO, WARNING, ERROR, NEEDED };
private:
    LogLevel Errorlevel = ALL;
    string LogLevelNames[5] = { "ALL","INFO","WARNING", "ERROR", "NEEDED" };
public:
    Logger(LogLevel level) {
        Errorlevel = level;
        // 优化:去掉条件判断,初始化时总是打印日志
        cout << "[" << LogLevelNames[Errorlevel] << "]: " << "LOGGER set to: " << LogLevelNames[Errorlevel] << std::endl;
    }
    ~Logger() {
        if (Errorlevel <= WARNING) {
            cout << "[" << LogLevelNames[Errorlevel] << "]:" << " LOGGER destroyed" << std::endl;
        }
    }
    void log(LogLevel level, string message) {
        if (Errorlevel <= level) {
            cout << "[" << LogLevelNames[level] << "]: " << message << std::endl;
        }
    }
};

int main() {
    Logger logger(Logger::WARNING); // 简化写法,无需显式写LogLevel类型
    logger.log(Logger::ERROR, "test ERROR"); // 修复枚举值写法
    logger.log(Logger::INFO, "test INFO"); // 修复枚举值写法
    system("PAUSE");
}

运行这段代码后,所有编译错误都会消失,你能看到正常的日志输出。

内容的提问来源于stack exchange,提问作者Mayor Jellies

火山引擎 最新活动