c++ - 具有模板参数和 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
——但显然不是。哪种语言规则导致它以这种方式运行?
第二个问题是(显然):我可以做些什么来避免这种重复吗?
解决方案
推荐阅读
- javascript - 如何暂时禁用轮播的 CSS 过渡?
- android - 可以构建 Android 项目 (Cmd F9),但由于 GSON BEGIN_OBJECT BEGIN_ARRAY 问题,运行 (Ctrl R) 错误
- java - 正则表达式的新手
- c# - 通过 Microsoft 的 Azure 创建注册调用注册设备时的通道 uri 是什么
- javascript - 反应 Axios 输入未定义
- angular - 从角度5一直更新到9,角度材料@7的问题
- javascript - 如何将'__extends = function(){}'重写为对象
- c++ - 将数字转换为填充字符串
- c++ - 动态类的分段错误(作业问题)
- django - Django:将上下文传递给另一个视图