clang vs g 在类模板上不同意参数和模板模板参数重新分支
Clang vs G++ disagree on class template number of arguments and template template parameter redeclaration
在以下示例中, Abstract
是一个类模板,其第一个参数是类型,第二个参数是另一个模板,将BOOL与任何数量的ARGS一起使用。
template<bool,typename>
struct Default;
template< typename T = void,
template<bool,typename ...> class = Default>
struct Abstract;
template<typename T>
struct Abstract<T>
{};
template<typename T, template<bool> class C>
struct Abstract<T,C> : Abstract<T>
{};
int main()
{}
Clang和C 的输出如下:
clang: http://rextester.com/bjsw46677
错误:类模板部分专业化并不专业 模板参数;
g http://rextester.com/mdn65674
确定
所以,我决定对Abstract
的声明中的第三个参数添加。
template< typename T = void,
template<bool,typename ...> class = Default,
typename = void >
struct Abstract;
现在,clang和g 都很好。我猜Clang抱怨的原因是因为专业并没有真正专业。但这不是真的。它专门用于参数数量。
接下来,我为模板模板参数添加了另一个专业化。该示例看起来像这样:
template<bool,typename>
struct Default;
template< typename T = void,
template<bool,typename ...> class = Default,
typename = void >
struct Abstract;
template<typename T>
struct Abstract<T>
{};
template<typename T, template<bool> class C>
struct Abstract<T,C> : Abstract<T>
{};
template<typename T, template<bool,typename> class G>
struct Abstract<T,G> : Abstract<T>
{};
int main()
{}
Clang和C 的输出如下:
clang: http://rextester.com/ljioc38789
错误:
Abstract<type-parameter-0-0, C, void>
的重新定义注意:上一个定义是struct Abstract<T,C> : Abstract<T>
g : http://rextester.com/tsdrz44717
ok-(也不需要声明中的第三个参数(
i 不要以为clang在这里就在这里,因为第三个专业化对于模板模板参数有效,而variadic模板参数允许我专门针对任何数量的参数。但是,我不确定。
问题:哪个编译器是错误的?为什么?从规格中获取报价并对该主题更加清晰真的很高兴。
正如评论中指出的,问题的第一部分(即,是否允许它专业地专业地使用主模板中的variadic模板的模板模板参数 - 本质上是与另一个问题相同。如果您阅读了我对这个问题的回答,它包含了部分订购规则的部分专业化的摘要。特别是在您的情况下,问题是,由于C 17,template<bool,typename ...> class
参数可以接受template<bool> class
参数,而 vice vice vices ;这意味着,在C 17及以后,部分订购规则得出的结论是,您所写的部分专业化不是比主要模板更专业的部分专业化,这使该程序不构建。<<<<<<<<<<<<<<
(FWIW,Godbolt上可用的Clang Trunk的最新版本接受了专业化,我希望CWG2398最终以使该代码形成良好的方式解决。(
(至于问题的第二部分,关于一对部分专业:
template<typename T, template<bool> class C>
struct Abstract<T,C> : Abstract<T>
{};
template<typename T, template<bool,typename> class G>
struct Abstract<T,G> : Abstract<T>
{};
某些版本的声称第二个版本是"重新宣传"。第一个只是胡说八道。在这些版本中,这大概是一个错误。这是固定在中继的。
- 模板元编程:如何将参数包组合成新的参数包
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 我可以动态创建新地图并作为函数参数传递吗?
- 根据参数创建派生类的新实例
- 为模板参数类型中的新对象分配内存
- 如何在新设计中迁移需要几个额外参数的函数
- 使用新表达式的模板参数推断失败
- 使用 libgit2 从另一个分支创建新的 git 存储库?
- 具有构造函数的新对象数组,需要在C++中设置参数
- 如何避免参数数量依赖于条件的调用分支?
- clang vs g 在类模板上不同意参数和模板模板参数重新分支
- 将const char * const参数成员分配给新值
- 将新对象的名称作为参数传递
- 将QMETAMETHOD作为参数传递到使用新的Qobject :: Connect语法的函数
- 从 1 中创建新的字符 * 作为参数,元素位于 2 个索引之间
- 关于将指针作为参数传递到函数:它实际上在函数中创建了新的指针
- 在创建新对象时,尝试将参数提供给JNI对象的构造函数时会出现错误
- 将 std::function 的参数作为参数提供给新对象的前向参数
- 在C++中混合模板参数和变量时的分支
- 每个新客户端的 GStreamer 和 URI 查询参数提取