C++ 部分模板模板特化

C++ partial template template specialization

我想将部分模板特化传递给模板模板参数,但出现错误。我不确定为什么这不起作用。

template<template<typename, int> class V, typename T, int N, int... Indexes>
class Swizzle
{
    // ...
};

template<typename T, int N>
struct Vector;

template<typename T>
struct Vector<T, 3>
{
    // ...

    union
    {
        // ...
        Swizzle<Vector, T, 3, 0, 0, 0> xxx;
    };
};

错误:

'Vector': invalid template argument for template parameter 'V', expected a class template 'Swizzle': use of class template requires template argument list

问题仅出现在 MSVC

在 class 模板 Vector 中,Vector 指的是模板实例的类型和模板本身。

This should compile:

template<class X, int M>
using Self = Vector<X,M>;
// ...

union
{
    // ...
    Swizzle<Self, T, 3, 0, 0, 0> xxx;
};

我怀疑 MSVC 在这里是错误的,但不确定。

在 class 和 class name injection 中,Vector 可能指的是模板实例的类型和模板本身。

In the following cases, the injected-class-name is treated as a template-name of the class template itself:

[..]

  • it is used as a template argument that corresponds to a template template parameter

所以这里的Msvc是错误的

可能的解决方法:

Swizzle<::Vector, T, 3, 0, 0, 0> xxx;

Demo