Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内部模板类的递归专门化结束_C++_Templates_C++11_Specialization - Fatal编程技术网

C++ 内部模板类的递归专门化结束

C++ 内部模板类的递归专门化结束,c++,templates,c++11,specialization,C++,Templates,C++11,Specialization,考虑以下工作代码: #include <typeinfo> template <typename ...> struct A; template <typename First, typename... Rest> struct A<First, Rest...> { static void execute() { std::cout << typeid(First).name() << ' ';

考虑以下工作代码:

#include <typeinfo>

template <typename ...> struct A;

template <typename First, typename... Rest>
struct A<First, Rest...> {
    static void execute() {
        std::cout << typeid(First).name() << ' ';
        A<Rest...>::execute();
    }
};

template <>
struct A<> {
    static void execute() {}  // End of recursion.
};

int main() {
    A<char, bool, int>::execute();  // char bool int
}
#包括
模板结构A;
模板
结构A{
静态void execute(){

std::cout[temp.expl.spec]/p15禁止在不显式专门化每个封闭模板的情况下显式专门化成员模板:

一个成员或一个成员模板可以嵌套在多个封闭类模板中。在此类成员的显式专门化中,对于每个显式专门化的封闭类模板,成员声明前应加一个
模板
。[示例:

模板类别A{
B类模板{
void mf();
};
};
模板类A::B;
模板模板无效A::B::mf();
-[结束示例]

例如,此代码编译:

模板
模板
结构A::B{
静态void execute(){}//递归结束
};
但它不允许您使用封闭类模板中的模板参数。更好的方法是在主模板中使用包扩展“技巧”:

模板
模板
结构A::B{
静态void execute(){
使用unpack=int[];

(无效)拆包{((std::我不确定我是否读对了。所以我用
模板
替换了我的
模板
?那也不编译。我仍然需要我的
A
@prestokeys是的,现在有两个模板正在被专门化,
A
A::B
。编辑:是的,我意识到,我会发布编辑。是的,我知道w有解决办法,包括这个包扩展技巧。但我仍在努力理解语言。最初的尝试是非法的,还是编译器忽略了语法?@prestokeys是的,最初的尝试是非法的。由于不允许这样做的原因,我不确定。
#include <typeinfo>

template <typename ...> struct A;

template <typename... Ts>
struct A {
    template <typename...> struct B;
    template <typename...> static void execute();
};

template <typename... Ts>
template <typename First, typename... Rest>
struct A<Ts...>::B<First, Rest...> {
    static void execute() {
        std::cout << typeid(First).name() << ' ';
        B<Rest...>::execute();
    }
};

template <typename... Ts>
template <> // invalid explicit specialization before '>' token
struct A<Ts...>::B<> {  // template parameters not used in partial specialization: Ts
    static void execute() {}  // End of recursion
};

template <typename... Ts>
template <typename... Us>
void A<Ts...>::execute() {
    B<Ts..., Us...>::execute();
}

int main() {
    A<char, bool, int>::execute<double, short, float>();
}
template <typename... Ts>
template <typename Last>
struct A<Ts...>::B<Last> {
    static void execute() {std::cout << typeid(Last).name();}
};