// 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
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.