无法定义依赖 typedef 的成员

2023-11-25

我正在编写自定义惰性字符串类。

template <typename charT, typename traits = std::char_traits<charT>>
class lazy_basic_string
{
    class char_proxy
    {
        char_proxy& operator=(charT ch);
    };

    char_proxy operator[](size_type i);
}

然后我想在类声明之外定义这些方法。

template <typename charT, typename traits>
using char_proxy = typename lazy_basic_string<charT, traits>::char_proxy;

template <typename charT, typename traits>
char_proxy<charT, traits>& char_proxy<charT, traits>::operator=(charT ch)
{
    ...
}

但我得到编译错误:

无法定义依赖 typedef char_proxy 的成员

所以我无法弄清楚这里出了什么问题。 为什么编译器不能使用快捷方式 char_proxy 而不是 lazy_basic_string::char_proxy ?


标准似乎没有特别明确地规定这一点。我能得到的最接近的是[温度等级]:

3 - 当成员函数、成员类、成员枚举、静态数据成员或成员 类模板的模板是在类模板定义之外定义的,成员定义是 定义为模板定义,其中模板参数是类模板的那些。这 成员定义中使用的模板参数名称可能与模板不同 类模板定义中使用的参数名称。类后面的模板参数列表 成员定义中的模板名称应按照与在成员定义中使用的顺序相同的顺序来命名参数。 成员的模板参数列表。 [...]

这意味着,尽管没有明确说明,外线类模板成员定义应该通过名称引用类模板,而不是通过别名模板。

应该很容易理解为什么这是必要的;由于别名模板可能导致任意复杂的计算,为了将类模板成员的使用与潜在的定义相匹配,编译器必须对别名模板参数的每种可能的组合执行该计算:

template<class T> struct S { void f(); };
template<class T> using s_t = std::conditional_t<sizeof(T) % 8 == 0,
    S<T>, S<T*>>;
template<class T> void s_t<T>::f() {}

int main() { S<int> s; s.f(); }    // defined?

有趣的是,clang(3.7)允许在类模板成员定义中使用别名模板,但仅限于直接身份计算:

template<class> struct T { void f(); };
template<class C> using id_t = C;
template<class C> using t_t = T<id_t<C>>;
template<class C> void t_t<C>::f() {}    // OK??
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法定义依赖 typedef 的成员 的相关文章

随机推荐

  • Selenium:使用 Python 获取元素的坐标或尺寸

    我看到有一些方法可以通过 Selenium 的各种 Java 库获取元素的屏幕位置和尺寸 例如org openqa selenium Dimension 其中提供 getSize and org openqa selenium Point
  • LINQ - 序列不包含元素

    我正在使用 LINQ 查询 如下所示 object collection where t gt t id Equals 2 First 我收到错误 序列不包含元素 为什么结果不包含元素时会抛出错误 当没有找到结果时 它不应该返回 null
  • 在 Android 上以编程方式设置 VPN

    我找到了以下代码以编程方式建立新的 VPN 但我不知道如何使用它来创建我的应用程序 VpnService service context getSystemService VPN SERVICE VpnProfile profile Vpn
  • Visual Studio:如何使用 WPF 编写编辑器扩展

    我正在尝试为 Visual Studio 编写一个编辑器扩展 我已经下载了 VS SDK 并创建了一个新的 Visual Studio Package 项目 但为我创建的虚拟控件是 Windows 窗体控件 而不是 WPF 控件 我正在尝试
  • 如何从 PostgreSQL 存储过程获取结果集?

    我在 PostgreSQL 11 中创建了一个存储过程来执行 CRUD 操作 它对于 1 创建 2 更新 3 删除运行良好 但是当我通过传递来运行读取命令时Condition 4要选择结果集 我收到以下错误 我已经使用 PostgreSQL
  • 在 QGraphicsScene 中显示图像

    我有一个简短的脚本 可以使用 PIL 多次修改图像 我希望能够在完成时显示中间步骤 因此我添加了一个 QGraphics 场景 并尝试在那里显示阶段 它将正确调整最后阶段的大小和居中 退出功能之前发布的最后一个阶段 但它会显示中间步骤 但不
  • php starup sqlsrv无法初始化模块

    我正在尝试将 MSSQL 连接到 PHP 我正在关注this教程 无论如何 在我按照该教程中所述添加 dll 文件后 我收到以下警告 我该如何解决这个问题 php starup sqlsrv unable to initialize mod
  • 证明SQL注入

    我试图在这里简单地证明这个简单的函数不足以阻止世界上的每一个 sql 注入 Function CleanForSQL ByVal input As String As String Return input Replace End Func
  • 具有多个应用程序的 ASP.NET Identity

    因此 我们的组织正在使用 ASP NET MVC 和 Web API 开发一些新的 Web 应用程序 我们决定不使用 Active Directory 进行身份验证 授权 因此看起来带有实体框架的 ASP NET 身份可能会起作用 查看数据
  • 使用 AutoResetEvent 同步两个线程

    我正在尝试实施AutoResetEvent 为此 我使用一个非常简单的类 public class MyThreadTest static readonly AutoResetEvent thread1Step new AutoResetE
  • 如何将视图添加到 LinearLayout,但从下向上?

    可以添加视图LinearLayout一个接一个向上的方向 您可以通过以下方式以编程方式添加它 LinearLayout layout LinearLayout findViewById R id layout layout addView
  • 在 Qt 安装程序框架 (QtIFW) 安装程序中安装 VC++ Redistributables?

    我正在使用 Qt Installer Framework v2 0 1 为我的应用程序构建安装程序 我正在 Windows 上为 x86 和 x64 构建应用程序 因此我正在为每个体系结构构建一个安装程序 每个体系结构中打包有不同的 VC
  • any() 是否被延迟评估?

    我正在编写一个脚本 其中我必须根据多种条件测试数字 如果any满足我想要返回的条件True我想以最快的方式做到这一点 我的第一个想法是使用any 而不是嵌套if语句或多个or链接我的条件 因为如果有任何一个条件满足的话我会很满意True我真
  • 如何防止默认复选框事件覆盖我的 jQuery 检查/取消选中功能?

    我在表格内有一个复选框列表 其中包含一个简单的 jQuery 函数 该函数允许用户单击表格行中的任意位置来选中 取消选中复选框 它工作得很好 除非用户实际单击该复选框 那就不行了 有任何想法吗 这是我的代码 HTML tr tr jQuer
  • Google Codejam 亚太地区测试练习轮:括号顺序

    我花了一天时间解决这个问题并且找不到传递大型数据集的解决方案 Problem n 个括号序列由 n 个 和 n 个 组成 现在 我们有了所有有效的 n 个括号序列 找到第 k 个最小的序列词典编纂的 order 例如 以下是按字典顺序排列的
  • 在 Hibernate 之前运行 SpringLiquibase

    我正在使用 SpringLiquibase 在应用程序启动期间自动应用 liquibase 更新 一般来说 这工作正常 但是当我将 hibernate hbm2ddl auto 设置为 验证 时 hibernate 开始抱怨数据库方案 然后
  • 打印整数或带有 n 位小数的浮点数

    在Python中 当后一种情况需要我将打印输出限制为一定数量的数字时 如何打印可能是整数或实数类型的数字 长话短说 假设我们有以下示例 print 0 3f format num I cannot do print format num b
  • 在 EMACS org.mode 中覆盖 Ctrl-TAB

    I would like to use Ctrl Tab in EMACS for my own use but Emacs org mode already has this bound How can I use my own bind
  • 有没有办法在 Rails 中搭建单例资源?

    如果您正在使用单一资源 则常规的脚手架方式不起作用 有什么方法可以通过脚手架获取默认的单一控制器吗 假设如果用户只有一个帖子 是否可以简单地运行如下命令 rails g scaffold post singular 当您查看 Rails 3
  • 无法定义依赖 typedef 的成员

    我正在编写自定义惰性字符串类 template