Étant donné une classe de modèle comme celle-ci:
template<typename Type, typename IDType=typename Type::IDType>
class Mappings
{
public:
...
Type valueFor(const IDType& id) { // return value }
...
};
Comment quelqu'un peut-il déclarer cette classe dans un fichier d'en-tête?
c++
templates
forward-declaration
Tron Thomas
la source
la source
Vous pouvez déclarer des arguments par défaut pour un modèle uniquement pour la première déclaration du modèle. Si vous souhaitez autoriser les utilisateurs à transmettre la déclaration d'un modèle de classe, vous devez fournir un en-tête de transfert. Si vous souhaitez transférer déclarer le modèle de classe de quelqu'un d'autre en utilisant les valeurs par défaut, vous n'avez pas de chance!
la source
Vous pouvez déclarer une classe basée sur un modèle dont la définition indique les arguments par défaut, mais chaque fois que vous référencez la classe, vous devez inclure tous ses arguments jusqu'à ce que la définition soit introduite.
par exemple. Utilisons
std::vector
sans l'inclure (le deuxième argument destd::vector
est défini avec une valeur par défaut):On peut alors l'utiliser sans inclure le vecteur, par exemple:
Et nous pouvons l'utiliser avec
std::vector
, par exemple:Je n'ai pas vérifié les normes, mais cela fonctionne sur
clang
/gcc
avec-std=c++98
jusqu'à-std=c++17
, donc si ce n'est pas officiellement une norme, cela semble être officieusement le cas.la source
Foo<> foo;
.