依赖基数 class 中的常量使行外定义不匹配?
a constant in dependent base class make out-of-line definition not matched?
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{};
但其中 none 被编译器接受 (clang、msvc 和 gcc 7.5-)。 (为什么 gcc 8.1+ 有效?)
但如果我在 Y
处定义 stride
,例如 static constexpr size_t stride = X<Y, Num, 3>::stride
、1 和 2工作。
或者如果 X
不是 class 模板,它们也可以工作。
这是什么原因?标准声明的错误还是编译器错误?以及如何在 using X::stride
情况下工作?
这是不祥的,CWG2,标准中缺乏规范,其申请日期实际上已被遗忘。也就是说,您的选项 #2 显然是正确的选择,因为它的名称与 class.
中的声明相同 using-declaration
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{};
但其中 none 被编译器接受 (clang、msvc 和 gcc 7.5-)。 (为什么 gcc 8.1+ 有效?)
但如果我在 Y
处定义 stride
,例如 static constexpr size_t stride = X<Y, Num, 3>::stride
、1 和 2工作。
或者如果 X
不是 class 模板,它们也可以工作。
这是什么原因?标准声明的错误还是编译器错误?以及如何在 using X::stride
情况下工作?
这是不祥的,CWG2,标准中缺乏规范,其申请日期实际上已被遗忘。也就是说,您的选项 #2 显然是正确的选择,因为它的名称与 class.
中的声明相同 using-declaration