c++ - 依赖基类中的常量使外部定义不匹配?

标签 c++ c++11 templates language-lawyer crtp

template<template<typename, size_t>class V, typename, size_t N>
struct X{
    static constexpr size_t stride = N;
};

template<typename Num, size_t N>
struct Y;
template<typename Num>
struct Y<Num, 3> : protected X<Y, Num, 3>{
    using X<Y, Num, 3>::stride;

    Y<Num, stride> foo(Num angle, Y<Num, stride> axis) const;
};
我尝试为 foo 提供一个定义喜欢:
1.
template<typename Num>
Y<Num, 3> Y<Num, 3>::foo(Num angle, Y<Num, 3> axis) const{};

  • template<typename Num>
    Y<Num, Y<Num, 3>::stride> Y<Num, 3>::foo(Num angle, Y<Num, Y<Num, 3>::stride> axis) const{};
    

  • template<typename Num>
    Y<Num, X<Y, Num, 3>::stride> Y<Num, 3>::foo(Num angle, Y<Num, X<Y, Num, 3>::stride> axis) const{};
    
    但编译器(clang、msvc 和 gcc 7.5-)都不接受它们。 (为什么 gcc 8.1+ 有效?)
    但如果我定义 strideY喜欢 static constexpr size_t stride = X<Y, Num, 3>::stride , 1 2 工作。
    或者如果 X不是类模板,它们也能工作。
    什么原因?标准声明的错误还是编译器错误?以及如何在 using X::stride 工作情况?
    代码:https://godbolt.org/z/asn8rj .

    最佳答案

    不祥的是,这是CWG2 ,标准中缺乏规范,其申请日期实际上已被遗忘。也就是说,您的选项 #2 显然是正确的选择,因为它命名了与类中的声明相同的 using 声明。

    关于c++ - 依赖基类中的常量使外部定义不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64443239/

    相关文章:

    c++ - Qt QTreeWidget 替代 IndexFromItem?

    c++ - c++程序中的数据库连接检查

    c++ - 模板转换运算符

    c++ - SFINAE: std::enable_if 作为函数参数

    C++ 类对象作为函数参数

    c++ - 使用 boost::program_options 来解析文本文件是个好主意吗?

    c++ - 嵌套类构造函数中的父模板参数推导

    c++ - 为什么不将临时对象传递给另一个线程会导致未定义的行为?

    c++ - "typename"和 "template"关键字 : are they really necessary?

    angularjs - 你如何使用 gulp-angular-templatecache 和 gulp-usemin