Est std::unique_ptr<T> requis connaître la définition complète de T?

J'ai un peu de code dans un en-tête qui ressemble à ceci:

#include <memory>

class Thing;

class MyClass
{
    std::unique_ptr< Thing > my_thing;
};

Si je comprend cet en-tête dans un rpc qui ne comprennent pas le Thing de la définition de type, alors ce ne compile pas sous VS2010-SP1:

1>C:\Program Files (x86)\Microsoft
Visual Studio
10.0\VC\include\memory(2067): erreur C2027: utilisation de type non défini "Chose"

Remplacer std::unique_ptr par std::shared_ptr et il compile.

Donc, je suppose que c'est l'actuel VS2010 std::unique_ptrmise en œuvre, qui nécessite la définition complète et il est totalement mise en œuvre-dépendant.

Ou est-il? Est-il quelque chose dans les exigences de la norme qui rend impossible pour std::unique_ptrmise en œuvre, de travailler à l'avant d'une déclaration? C'est étrange comme il se doit seulement contenir un pointeur à Thing, n'est-ce pas?

  • La meilleure explication de quand vous faites et n'ont pas besoin d'un type complètes avec le C++0x pointeurs intelligents est Howard Hinnant du "Incomplet types et shared_ptr/unique_ptr" le tableau à La fin devrait répondre à votre question.
  • Merci pour le pointeur de James. J'avais oublié où j'ai mis la table! 🙂
  • stackoverflow.com/a/49187113/4361073
  • Le lien pour Howard Hinnant du site est en panne. Voici la web.archive.org version de lui. En tout cas, il a répondu parfaitement ci-dessous avec le même contenu 🙂
  • Une autre bonne explication est donnée dans l'Article 22 de Scott Meyers moderne et Efficace de C++.
InformationsquelleAutor Klaim | 2011-05-16