Je possède ce code:Pourquoi les modèles déclarés dans la structure sur l'en-tête ne violent-ils pas ODR et la spécialisation?
#include <iostream>
struct A
{
template<typename T> bool isImplemented()
{
std::cout << "Not Implemented" << std::endl;
return false;
}
};
template<> inline bool A::isImplemented<int>()
{
std::cout << "int Implemented" << std::endl;
return true;
}
Je peux comprendre pourquoi la spécialisation du modèle a besoin de la ligne, afin d'éviter l'ODR être violé la ligne va fusionner la table de traduction éviter un conflit.
Mais, pourquoi je n'ai pas besoin d'un inline sur le isImplemented à l'intérieur de la structure A? Peut-être que cette question peut être étendue à, pourquoi si la méthode est déclarée dans la structure/classe sur l'en-tête, il n'a pas besoin de l'inline? Comme je peux le comprendre, il créerait les symboles sur chaque fichier objet (.o) qu'il est appelé, en violation de l'ODR, pourquoi cela ne se produit pas?
Quelque chose avec un paramètre de modèle est essentiellement implicitement 'inline'. – aschepler
La spécialisation de modèle est une fonction. Le modèle est un modèle. Les modèles ne sont pas des fonctions, et vice versa. Les modèles suivent des règles différentes. –
@KerrekSB qui aide réellement beaucoup, merci. J'avais des problèmes en essayant de comprendre pourquoi je n'avais besoin que de spécialisations. J'imagine que c'est la même règle appliquée lorsque vous déclarez des opérateurs amis et vous devez utiliser en ligne afin d'empêcher la violation sur l'ODR, non? – Lefsler