C ++ частичная специализация шаблона шаблона - PullRequest
3 голосов
/ 04 февраля 2020

Я хочу передать частичную специализацию шаблона параметру шаблона, но получаю ошибку. Я не уверен, почему именно эта последняя работа.

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;
    };
};

Ошибка:

«Вектор»: недопустимый аргумент шаблона для параметра шаблона «V», ожидается шаблон класса «Swizzle» : использование шаблона класса требует списка аргументов шаблона

Проблема появляется только на MSV C

Ответы [ 2 ]

3 голосов
/ 04 февраля 2020

В шаблоне класса Vector, Vector относится как к типу этого экземпляра шаблона, так и к самому шаблону.

Это должно скомпилировать :

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

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

Я подозреваю, что MSV C здесь не так, но я не уверен.

1 голос
/ 04 февраля 2020

Внутри класса с введением имени класса , Vector может ссылаться как на тип этого экземпляра шаблона, так и на сам шаблон.

В следующих случаях имя введенного класса обрабатывается как имя шаблона самого шаблона класса:

[..]

  • оно используется в качестве аргумента шаблона, соответствующего параметр шаблона шаблона

Поэтому Msv c здесь неверен.

Возможное решение:

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

Демо

...