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=0、INFO=1、WARNING=2、ERROR=3、NEEDED=4。所以这个判断只会在级别是ALL或INFO时触发初始化日志,如果你想在设置任何级别时都打印初始化信息,可以去掉这个条件判断。
修正后的完整代码
#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




