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+ 有效?)但如果我定义
stride
在 Y
喜欢 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/