make_unique ne compile pas
Je suis en train de créer et d'utiliser des make_unique
pour std::unique_ptr
, de la même manière std::make_shared
existe pour std::shared_ptr
décrit ici. Herb Sutter mentions la possible mise en œuvre de make_unique
qui ressemble à ceci:
template<typename T, typename ...Args>
std::unique_ptr<T> make_unique( Args&& ...args )
{
return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
}
Il ne semble pas fonctionner pour moi. Je suis l'aide de l'exemple de programme suivant:
//testproject.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <iostream>
#include <memory>
#include <utility>
struct A {
A(int&& n) { std::cout << "rvalue overload, n=" << n << "\n"; }
A(int& n) { std::cout << "lvalue overload, n=" << n << "\n"; }
};
template<typename T, typename ...Args>
std::unique_ptr<T> make_unique( Args&& ...args ) {
return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
}
int main() {
std::unique_ptr<A> p1 = make_unique<A>(2); //rvalue
int i = 1;
std::unique_ptr<A> p2 = make_unique<A>(i); //lvalue
}
Et le compilateur (je suis en utilisant VS2010) me donne le résultat suivant:
1>d:\projects\testproject\testproject\testproject.cpp(15): error C2143: syntax error : missing ',' before '...'
1>d:\projects\testproject\testproject\testproject.cpp(16): error C2065: 'Args' : undeclared identifier
1>d:\projects\testproject\testproject\testproject.cpp(16): error C2988: unrecognizable template declaration/definition
1>d:\projects\testproject\testproject\testproject.cpp(16): error C2059: syntax error : '...'
1>d:\projects\testproject\testproject\testproject.cpp(22): error C2143: syntax error : missing ';' before '{'
1>d:\projects\testproject\testproject\testproject.cpp(22): error C2447: '{' : missing function header (old-style formal list?)
Aussi, si vous remplacez le make_unique
mise en œuvre à la suite de
template<class T, class U>
std::unique_ptr<T> make_unique(U&& u) {
return std::unique_ptr<T>(new T(std::forward<U>(u)));
}
(qui est prise à partir cette exemple), il compile et fonctionne très bien.
Quelqu'un peut me dire quel est le problème? Il me semble que VS2010 est d'avoir quelques ennuis avec ...
dans le modèle de déclaration, et je ne sais pas ce que je peux faire à ce sujet.
Vous devriez noter que Herb Sutter la suggestion n'est pas adapté pour les types de tableau. Stephan T Lavavej posté une version améliorée de son récent épisode de Base de C++ qui fonctionne pour les tableaux, aussi, comme
make_unique<int[]>(1, 2, 3)
.voici un lien vers le
make_unique
que KerrekSB mentionnésSi vous souhaitez utiliser les variadic templates dans visual studio, vous devez les dernières mises à jour. Mes propres instructions: scrupulousabstractions.tumblr.com/post/36204698243/...
Votre make_unique exemple ne compile pas pour moi. Je reçois
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
OriginalL'auteur Saage | 2012-12-14
Vous devez vous connecter pour publier un commentaire.
Variadic templates ne sont pas disponibles dans la version de Visual C++ 11. Toutefois, vous pouvez simuler l'argument de l'expansion, soit avec beaucoup de copier/coller le code pour différents nombre de paramètres, ou d'utiliser le même compilateur astuces utilisées dans Microsoft mise en œuvre de la "pseudo-variadics". À partir de ce commentaire sur Herb Sutter blog: http://herbsutter.com/gotw/_102/#comment-6428
_[A-Z].*
identifiants est réservé à la mise en œuvre (dans votre cas, le compilateur VC++ et le Dirkumware STL).Merci pour cette remarque, personnellement, je n'aime pas commencer les identificateurs avec
_
. Lorsque j'ai mis en placemake_unique()
au travail, j'ai élargi le code à 10 paramètres à la main (err, le copier/coller) et de l'objet de dumping dans un utilitaire de noms pour éviter tout conflit avec un avenirstd
mise en œuvre.OriginalL'auteur Bret Kuhns
Selon MSDN, variadic templates ne sont pas pris en charge dans Visual C++ 2010 ou 2012.
VC++ novembre 2012 CTP peuvent être trouvés ici
OriginalL'auteur Mike Seymour