首页 > 解决方案 > 具有模板参数和 crtp 的类,仅按类名调用构造函数

问题描述

我不确定我应该搜索什么,所以如果这个问题已经被问到,我很抱歉。

我有以下代码

namespace ns {
    template<typename crtp> struct  base_type {
        template<typename ...Args> base_type(Args &&...args);
    };
}

struct derived_type: ns::base_type<derived_type> {
    derived_type(int a, float b): base_type{a, b} {}
};

template<typename template_arg>
struct derived_template_type: ns::base_type<derived_template_type<template_arg>> {
    derived_template_type(int a, float b): base_type{a, b} {}
};

derived_type编译得很好。derived_template_type编译失败,出现以下错误(clang,c++17):

error: member initializer 'base_type' does not name a non-static data member or base class
    derived_template_type(int a, float b): base_type{a, b} {}
                                           ^~~~~~~~~~~~~~~

为了使它工作,我必须base_type用它的完全限定名称替换这个用法ns::base_type<derived_template_type<template_arg>>- 所以基本上重复基类列表中已经存在的内容。

第一个问题是:为什么会这样?编译器应该知道这是基类,知道它的位置以及它的模板参数是什么——比如在这种情况下derived_type——但显然不是。哪种语言规则导致它以这种方式运行?

第二个问题是(显然):我可以做些什么来避免这种重复吗?

标签: c++templatescrtp

解决方案


推荐阅读