gpt4 book ai didi

c++ - 将可变参数模板模板参数专用于最小参数数量 : legal or not?

转载 作者:IT老高 更新时间:2023-10-28 22:21:30 29 4
gpt4 key购买 nike

我有代码:

#include <cstdio>

template<template<typename...> class>
struct Foo
{
enum { n = 77 };
};

template<template<typename, typename...> class C>
struct Foo<C>
{
enum { n = 99 };
};

template<typename...> struct A { };

template<typename, typename...> struct B { };

int main(int, char**)
{
printf("%d\n", Foo<A>::n);
printf("%d\n", Foo<B>::n);
}

这个想法是template<typename, typename...> classtemplate<typename...> class 的子集,所以有可能专门研究它。但它非常深奥,所以也许不是。让我们试试看。

GCC 4.7 说:

$ g++ -std=c++11 test157.cpp 

编译好了!

运行它:

$ ./a.out 
77
99

有效!

Clang 3.1 说:

$ clang++ -std=c++11 test157.cpp
test157.cpp:10:8: error: class template partial specialization does not specialize any template argument; to define the primary template, remove the template argument list
struct Foo<C>
^ ~~~
test157.cpp:9:10: error: too many template parameters in template template parameter redeclaration
template<template<typename, typename...> class C>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test157.cpp:3:10: note: previous template template parameter is here
template<template<typename...> class>
^~~~~~~~~~~~~~~~~~~~~
2 errors generated.

谁是对的?

最佳答案

Clang 拒绝部分特化是错误的。要知道如何解释错误消息,您需要了解 clang 诊断的内容。这意味着诊断其参数与主要类模板的隐式参数列表完全匹配的部分特化( <param1, param2, ... , paramN> )。

但是参数列表不同,所以 clang 不会诊断它。特别是,这与偏特化是否匹配或多或少的参数无关。考虑

template<typename A, typename B> class C;
template<typename B, typename A> class C<A, B> {};

这里的部分特化匹配所有内容,而不是主模板匹配的更多内容。并且两个模板的参数列表是不同的,所以这个部分特化是有效的,就像你的一样。

关于c++ - 将可变参数模板模板参数专用于最小参数数量 : legal or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9772264/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com