2014-05-22 1 views
0

J'ai vu this et je l'ai corrigé mon code:C de l'erreur avec l'opérateur = de unique_ptr en utilisant std :: move (nullptr)

int solutionChooser = m_configFile.getChosenSolution(); 
ISolution* currentSolution; 
switch (solutionChooser) 
{ 
    case 1: 
    { 
    currentSolution = new Solution1()); 
    break; 
    } 
    case 2: 
    { 
    currentSolution = new Solution2()); 
    break; 
    } 
    case 3: 
    { 
    currentSolution = new Solution3()); 
    break; 
    } 
    case 4: 
    { 
    currentSolution = new Solution4()); 
    break; 
    } 
    default: 
    { 
    std::cout << "The specified solution does not exists\n"; 
    return; 
    } 
} 

en utilisant unique_ptr comme:

int solutionChooser = m_configFile.getChosenSolution(); 
std::unique_ptr<ISolution> currentSolution; 
switch (solutionChooser) 
{ 
    case 1: 
    { 
    currentSolution.reset(new Solution1()); 
    break; 
    } 
    case 2: 
    { 
    currentSolution.reset(new Solution2()); 
    break; 
    } 
    case 3: 
    { 
    currentSolution.reset(new Solution3()); 
    break; 
    } 
    case 4: 
    { 
    currentSolution.reset(new Solution4()); 
    break; 
    } 
    default: 
    { 
    currentSolution = std::move(nullptr); // here is the error 
    std::cout << "The specified solution does not exists\n"; 
    return; 
    } 
} 

et maintenant je je suis obtenir l'erreur ci-dessous:

error: no match for ‘operator=’ (operand types are ‘std::unique_ptr<ISolution>’ and ‘std::remove_reference<long int>::type {aka long int}’) 

Je ISolution comme interface et le SolutionX sont des classes dérivées de ISolution

Comment résoudre ce problème? Qu'est-ce que je fais mal?

+0

Supprimez simplement cette ligne du cas par défaut. Vous ne semblez pas en avoir besoin. – juanchopanza

+0

Essayez d'utiliser 'currentSolution.reset (nullptr)'; l'erreur est que nullptr est (au moins sur Visual Studio) implicitement convertible en int, et int n'est pas un pointeur de n'importe quel type. alternatevly essaie de faire 'std :: move (nullptr) – Creris

+3

' move (nullptr) '? Hey, j'allais toujours utiliser ce 'nullptr'! –

Répondre

3

std::unique_ptr a supprimé operator=, c'est pourquoi vous ne pouvez pas l'utiliser.

Pour réinitialiser le std::unique_ptr, utilisez reset() méthode:

currentSolution.reset(nullptr); 

mais vous ne devez pas le faire, puisque la valeur initiale est nullptr de toute façon.

+0

Semble fonctionner comme vous dites. Ne fonctionne pas: 'se déplacer (nullptr)', 'se déplacer (nullptr)' –

3

Votre compilateur ne va pas, par n3376 std::unique_ptr devrait avoir la suite surcharge

unique_ptr& operator=(nullptr_t) noexcept; 

donc, votre code devrait fonctionner correctement.

+0

J'utilise g ++ 9 sur Ubuntu 14.04 –

+0

'g ++ 9'? cela ne semble pas juste ... – Massa

0

Je ne peux pas ajouter de commentaires, donc je vais juste poster mon idée sur la réponse .. Je crois que votre problème est le constructeur de la copie. L'opérateur = n'est pas défini avec unique_ptr, vous devrez donc utiliser un constructeur de déplacement. Je ne me rappelle pas la syntaxe correcte mais il devrait être quelque chose de similaire à:

/* Header file */ 
std::unique_ptr<ISolution> currentSolution; 

/* CPP file */ 
std::unique_ptr<ISolution> currentSolution2(new ISolution); 
currentSolution = std::move(currentSolution2); 

Il y a probablement quelques erreurs ici mais nous espérons qu'il peut vous arriver à la bonne voie. Si vous voulez un exemple de travail, j'en ai un sur floobits, l'utilisateur Simple2012. Lien ici: https://floobits.com/Simple2012/Laboration_SearchMethods Vérifiez arr.h et arr.cpp pour un exemple concret, mais j'utilise un tableau là-bas au lieu d'une classe, pas beaucoup de différence cependant.

Questions connexes