如何解决依赖基类中的常量使离线定义不匹配?
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,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,3> axis) const{};
template<typename Num>
Y<Num,3>::stride> Y<Num,3>::stride> axis) const{};
template<typename Num>
Y<Num,X<Y,3>::stride> axis) const{};
,但编译器(clang,msvc和gcc 7.5-)均不接受它们。 (为什么要使用gcc 8.1 +?)
但是如果我像stride
在Y
定义static constexpr size_t stride = X<Y,3>::stride
,则 1 和 2 工作。
或者如果X
不是类模板,它们也可以正常工作。
是什么原因?标准声明的错误还是编译器错误?以及如何在using X::stride
情况下工作?
代码:https://godbolt.org/z/asn8rj。
解决方法
不祥的是,CWG2是该标准中缺乏规范的规定,而该标准实际上已经忘记了其提交日期。就是说,选项#2显然是正确的选择,因为它与类中的声明命名相同的 using-declaration 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。