C++ 使用通过模板注入的模板化类型

C++ 使用通过模板注入的模板化类型,c++,template-meta-programming,generic-programming,C++,Template Meta Programming,Generic Programming,这是我第一次尝试应用does概念,这无疑是很难理解的。我创建了一个通用的记录器类型,它可以在编译时决定日志级别是否足够高,以便输出。以下是编译器资源管理器上的问题示例:。这是记录器: static const int debug = 1; static const int info = 2; static const int warn = 3; static const int error = 4; static const int fatal = 5; template<int lev

这是我第一次尝试应用does概念,这无疑是很难理解的。我创建了一个通用的记录器类型,它可以在编译时决定日志级别是否足够高,以便输出。以下是编译器资源管理器上的问题示例:。这是记录器:

static const int debug = 1;
static const int info = 2;
static const int warn = 3;
static const int error = 4;
static const int fatal = 5;

template<int level, bool should_log = false>
struct logger_function {
    static void log(std::string message) {
        // Do nothing in the default case.
    }
};

template<int level>
struct logger_function<level, true> {
    static void log(std::string message) {
        std::cerr << "[" << level << "] : " << message << std::endl;
    }
};

template<int minLevel>
struct std_err_logger {
    template<int levelValue>
    struct level {
        static constexpr bool shouldLogResult = levelValue >= minLevel;

        typedef logger_function<levelValue, shouldLogResult> log_function;

        static void log(std::string message) {
            log_function::log(message);
        }
    };
};
static const int debug=1;
静态常数int info=2;
静态常数int warn=3;
静态常数int错误=4;
静态常数int致命=5;
样板
结构记录器函数{
静态无效日志(std::string消息){
//在默认情况下不执行任何操作。
}
};
样板
结构记录器函数{
静态无效日志(std::string消息){

std::cerr问题在于您错误地使用了依赖模板。您应该写:

template<typename logger>
class log_client {
    log_client() {
        logger::template level<fatal>::log("Worked!");
    }
};
模板
类日志客户端{
log_client(){
记录器::模板级别::日志(“已工作!”);
}
};

有关您为什么需要
模板的解释,请参阅。

问题是您错误地使用了依赖模板。您应该写:

template<typename logger>
class log_client {
    log_client() {
        logger::template level<fatal>::log("Worked!");
    }
};
模板
类日志客户端{
log_client(){
记录器::模板级别::日志(“已工作!”);
}
};

有关您为什么需要
模板的解释,请参阅。

您可以在godbolt.org上给出一个实例吗?这将大大简化helping@bartop当然,我现在就做。谢谢。@bartop这里是:谢谢你的帮助!请编辑问题,这样其他人就可以很容易地看到它。谢谢这些问题看起来不太一样o通常可以归结为:你能在godbolt.org上给出一个真实的例子吗?这将大大简化helping@bartop当然,我现在就做。谢谢。@bartop这里是:谢谢你的帮助!请编辑问题,这样其他人就可以很容易地看到它。谢谢这些问题通常可以归结为
src/alsa/alsa_frame_recorder.h: In constructor ‘alsa::log_client<logger>::log_client()’:
src/alsa/alsa_frame_recorder.h:21:31: error: ‘::log’ has not been declared
             logger::level<1>::log("Worked!");
                               ^~~
src/alsa/alsa_frame_recorder.h:21:31: note: suggested alternative: ‘long’
             logger::level<1>::log("Worked!");
                               ^~~
                               long
template<typename logger>
class log_client {
    log_client() {
        logger::template level<fatal>::log("Worked!");
    }
};