3 votes

C++ spécialisation partielle de modèle de modèle

Je veux passer une spécialisation de modèle partiel à un paramètre de modèle de modèle mais je reçois une erreur. Je ne suis pas sûr exactement pourquoi cela ne fonctionne pas.

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

template
struct Vector;

template
struct Vector
{
    // ...

    union
    {
        // ...
        Swizzle xxx;
    };
};

Erreur:

'Vector' : argument de modèle invalide pour le paramètre de modèle 'V', un modèle de classe 'Swizzle' est attendu : l'utilisation d'un modèle de classe exige une liste d'arguments de modèle

Le problème apparaît uniquement sur MSVC

1 votes

Quel compilateur et quels drapeaux utilisez-vous? Ce code suffit-il pour reproduire le problème? Cela fonctionne pour moi sur Coliru une fois que j'ajoute quelques points-virgules.

0 votes

En fait, cela fonctionne sur mingw730_32.

0 votes

Je suis en train d'utiliser VS2019 et de corriger les points-virgules manquants, mais cela produit toujours cette erreur. J'ai essayé de coller le reste de mon code dans godbolt en utilisant clang comme compilateur, cela fonctionne donc je suppose que cela doit être une erreur de VS2019?.

3voto

Yakk Points 31636

Au sein du modèle de classe Vector, Vector fait référence à la fois au type de cette instance du modèle et au modèle lui-même.

Ceci devrait compiler:

template
using Self = Vector;
// ...

union
{
    // ...
    Swizzle xxx;
};

Je soupçonne que MSVC se trompe ici, mais j'en suis incertain.

0 votes

Échoue sur clang et gcc godbolt.org/z/Rox8M- mais la définition de type dans la portée globale fonctionne : godbolt.org/z/NyKfLr

0 votes

@MarekR Réparé. Juste une collision de noms.

1voto

Jarod42 Points 15729

Au sein de la classe avec injection de nom de classe, Vector peut se référer à la fois au type de cette instance du modèle et au modèle lui-même.

Dans les cas suivants, le nom de classe injecté est traité comme un nom de modèle du modèle de classe lui-même :

[..]

  • il est utilisé en tant qu'argument de modèle qui correspond à un paramètre de modèle de modèle

Donc, Msvc est incorrect ici.

Contournement possible :

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

Démo

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X