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.

Variadic Templates ne sont pris en charge que de la CTP.
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és
Si 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