29 votes

Lier d'amitié avec un paramètre de modèle de modèle

J'ai un modèle de classe avec un paramètre de modèle de modèle et je veux déclarer ce paramètre (c'est-à-dire toutes ses spécialisations) en tant que friend . Mais je ne trouve pas la syntaxe correcte.

 template <template <class> class T>
struct Foo {

    template <class U>
    friend T;           // "C++ requires a type specifier for all declarations"

    template <class U>
    friend struct T;    // "declaration of 'T' shadows template parameter"

    template <class U>
    friend struct T<U>; // "cannot specialize a template template parameter"

    pretty<please>
    lets(be) friends T; // Compiler shook its standard output in pity
};
 

Comment puis-je déclarer un paramètre de modèle de modèle comme friend ?

Extrait de Coliru

1voto

Trollliar Points 686

J'ai constaté ce problème est très intéressant pour la recherche. Selon la norme C++11 et ci-dessus), cela devrait fonctionner, je suppose:

template <template <class> class U>
struct identity {
    template <typename T>
    using type = U<T>;
};

template <template <class> class U>
struct Foo {
    template <typename>
    friend class identity<U>::type;
};

En raison d'un niveau d'indirection, il n'y a pas toutes les zones d'ombre et le nom de la réutilisation ici, et cette situation décrit comme suit:

cppreference:

À la fois la fonction de modèle et le modèle de classe déclarations peuvent apparaître avec l'ami spécificateur de non-local de la classe ou de la catégorie modèle (...). Dans ce cas, chaque spécialisation du modèle devient un ami, s'il est implicitement instancié, spécialisée partielle, ou explicitement spécialisés. Exemple: class A { template<typename> friend class B; }

Cependant, il semble que clang et MSVC penser le contraire: voir coliru ou godbolt. Par ailleurs, les messages d'erreur semblent dénués de sens, de sorte qu'il ressemble à un bug du compilateur (ou juste une détection incorrecte erreur de syntaxe). GCC compile et exécute mentionné extraits parfaitement, mais je n'ai toujours pas sûr que c'est une bonne solution.

-1voto

ventsyv Points 1164

Les modèles ont tendance à amener les programmeurs à compliquer trop les choses. Je ne sais pas exactement ce que vous essayez de faire, et je soupçonne qu'il existe probablement une meilleure façon de le faire, mais cela devrait fonctionner.

 template <template <class> class T, class U>
class Foo {
    friend class T<U>;
};
 

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