Déclaration anticipée de std :: wssortingng

// This is a header file. class MyClass; // It can be forward declared because the function uses reference. // However, how can I do forward declaraion about std::wssortingng? // class std::wssortingng; doesn't work. VOID Boo(const MyClass& c); VOID Foo(const std::wssortingng& s); 

Tu ne peux pas. #include , vous n’avez (presque) pas le choix.

La raison en est que wssortingng est défini dans l’espace de noms std et qu’il est typé avec std::basic_ssortingng . De manière plus élaborée, std::wssortingng est std::basic_ssortingng > . Cela signifie que pour déclarer- std::wssortingng vous devez déclarer- std::char_traits<> et std::basic_ssortingng<> dans le namespace std . Parce que (à quelques exceptions près) la norme interdit d’append des définitions ou des déclarations à l’espace de noms std (17.4.3.1/1), vous ne pouvez donc pas déclarer en aval un modèle ou un type standard d’une manière conforme à la norme. Concrètement, cela signifie que vous ne pouvez pas déclarer- std::wssortingng .

Et oui, nous sums tous d’accord pour dire qu’il serait pratique d’avoir un en-tête , comme pour . Mais il n’y en a pas. n’est pas non plus aussi difficile à comstackr que , mais néanmoins. Vous avez deux choix: #include ou utilisez un pointeur opaque .

std::wssortingng est un modèle d’instanciation, vous ne pouvez donc pas simplement le déclarer. Vous devrez utiliser le fichier d’en-tête.

Je ne pense pas que le fait d’éviter #include vous procure un réel avantage, mais voici comment vous pouvez le faire:

 namespace std { template struct char_traits; template struct allocator; template struct basic_ssortingng; typedef basic_ssortingng, allocator > wssortingng; } // simple test that it's compatible: std::wssortingng *p; // incomplete type at this point, but you can have a pointer #include  int main() { std::wssortingng s = L"Hello, world!"; p = &s; return 0; } 

Vous devez faire attention aux parameters par défaut; en particulier, cela ne fonctionnerait pas:

 namespace std { template struct char_traits; template struct allocator; template, class Allocator=allocator > struct basic_ssortingng; typedef basic_ssortingng wssortingng; } #include  

Compilé avec l’inclusion montre l’incompatibilité:

 In file included from /usr/include/c++/4.4/ssortingng:41, from example.cpp:15: /usr/include/c++/4.4/bits/ssortingngfwd.h:52: error: redefinition of default argument for 'class _Traits' example.cpp:8: note: original definition appeared here 

Vous ne pouvez pas transférer declare std::wssortingng dans une implémentation conforme, non pas parce que c’est un typedef pour une spécialisation de template ou qu’il existe une possibilité qu’elle ait un nombre inconnu d’arguments de template (ce n’est pas le cas; ceux-ci sont ssortingctement spécifiés ) mais parce qu’il existe une contrainte sur les programmes conformes qui leur interdit d’append des déclarations ou des définitions à l’espace de noms std autres que les spécialisations explicites des modèles standard spécialisés dans un type défini par l’utilisateur.

Cette contrainte est décrite dans 17.4.3.1 [lib.reserved.names] / 1. Il n’existe aucune exception pour les déclarations en std::wssortingng de std::wssortingng , vous devez #include pour qu’une déclaration std::wssortingng disponible dans un std::wssortingng conforme. façon.

class std::wssortingng; ne comstack pas. Mais cela fait:

 namespace std{ class wssortingng; } 

Cependant, cette déclaration est incompatible avec le fichier d’en-tête , que vous devriez voir si vous #include après celle-ci. Donc ce n’est vraiment pas sûr.