2014-01-10 2 views
4

Пока я заканчиваю свой прототип игры, я наткнулся на эту ошибку, я ее никогда не видел. я пытался связать воедино два .cpp файлов, это:Невозможно преобразовать параметр 1 из std :: shared_ptr <_Ty> (??)

#include <iostream> 
    #include "mage.h" 
    #include "Warrior.h" 
    #include "Rogue.h" 
    #include "CharacterType.h" 
    #include <memory> 
    #include <string> 
    #include "Inventory.h" 
    #include "blankEnemy.h" 
    #include "Enemy.h" 
    #include "Boss.h" 
    #include <cstdlib> 
    #include <ctime> 
    #include "DeathMenu.h" 
    #include "GameStart.h" 
    #include "FirstPhase.h" 
    #include <Windows.h> 
    #include "SecondPhase.h" 
    #include "PhaseOnePT2.h" 
    using namespace std; 

    int FirstPhase(blankCharacter* myCharacter, blankEnemy* myEnemy, Inventory* myInventory,  blankEnemy* myBoss) 
    { 
    //code 
    } 

Для этого: Int GameStart() {

std::shared_ptr<blankCharacter> myCharacter; 
    std::unique_ptr<blankEnemy> myEnemy; 
    std::unique_ptr<Inventory> myInventory; 
    std::unique_ptr<blankEnemy> myBoss; 




    string name; 
    int choice; 

    cout << "______________________________________________________________________________" << endl; 
    cout << "______________________________________________________________________________" << endl; 
    cout << "Your journey has only just begun" << endl; 
    cout << "______________________________________________________________________________" << endl; 
    cout << "______________________________________________________________________________" << endl; 

    cout << " Please enter player name." << endl << endl; 
    cin >> name;   
    system("cls"); 


    cout << "______________________________________________________________________________" << endl; 
    cout << "______________________________________________________________________________" << endl; 
    cout << "Please select fighting class." << endl << endl; 
    cout <<" 1 - Mage, although not the physically strongest, mages offer a healing role" << endl; 
    cout <<" 2 - Warrior, the most balanced of all the classes, excelling in durability." << endl; 
    cout <<" 3 - Rogue, for players who want to take a more creative approach to battle." << endl; 
    cout << "______________________________________________________________________________" << endl; 
    cout << "______________________________________________________________________________" << endl; 
    cin >> choice; 




    switch(choice) 
    { 
     case 1: //Mage 
      Beep(262,500); 
      myCharacter = std::unique_ptr<blankCharacter>(new Mage(20,40,60,70,100,180,60)); 
      myInventory = std::unique_ptr<Inventory>(new Inventory(3, 3,3)); 
      myEnemy = std::unique_ptr<blankEnemy>(new Enemy(150, 60, 150)); 
      myBoss = std::unique_ptr<blankEnemy>(new Enemy(200, 200, 200)); 
      //choice = FirstPhase(); 
     case 2: //Warrior 
      Beep(262,500); 
      myCharacter = std::unique_ptr<blankCharacter>(new Warrior(40,50,65,100,160,100,60)); 
      myInventory = std::unique_ptr<Inventory>(new Inventory(3, 3, 3)); 
      myEnemy = std::unique_ptr<blankEnemy>(new Enemy(150, 60, 150)); 
      myBoss = std::unique_ptr<blankEnemy>(new Enemy(200, 200, 200)); 
      choice = FirstPhase(myCharacter, myEnemy, myInventory, myBoss); 
     break; 

     case 3: //Rogue 
      Beep(262,500); 
      myCharacter = std::unique_ptr<blankCharacter>(new Rogue(30,55,70,90,160,100,100)); 
      myInventory = std::unique_ptr<Inventory>(new Inventory(3, 3, 3)); 
      myEnemy = std::unique_ptr<blankEnemy>(new Enemy(150,60,150)); 
      myBoss = std::unique_ptr<blankEnemy>(new Enemy(200, 200, 200)); 
     // choice = FirstPhase(myCharacter, myEnemy, myInventory, myBoss); 
     break; 

     default: 
     cout << "Please select a relevant value 1 to 3" << endl << endl; 
     break; 
    } 
    return 0; 

    }; 

Я ссылается Firstphase(); в заголовке и поместить его в GameStart();

FirstPhase.h:

#include "GameStart.h" 
    #include <string> 
    #include "CharacterType.h" 
    #include "mage.h" 
    #include "Rogue.h" 
    #include "Warrior.h" 
    using namespace std; 
    int FirstPhase(blankCharacter* myCharacter, blankEnemy* myEnemy, Inventory* myInventory, blankEnemy* myBoss); 

Однако я получаю эту ошибку:

ошибка C2664: 'FirstPhase': не удается преобразовать параметр 1 из 'станд :: shared_ptr < _Ty>' на «blankCharacter * Вокруг

choice = FirstPhase(myCharacter, myEnemy, myInventory, myBoss); 

Там нет, нет подходящего преобразования из shared_ptr < _Ty> к * blankCharacter существует? Я не знаю, как его решить.

+0

Кстати, вы должны опубликовать полную ошибку. Где-то там, он также говорит, что означает '_Ty'. – Angew

ответ

9

Смарт-указатели C++ 11 не предлагают автоматическое преобразование типов сырых указателей (из соображений безопасности) и из них. Используйте get():

choice = FirstPhase(myCharacter.get(), myEnemy.get(), myInventory.get(), myBoss.get()); 

еще лучше, изменить свою функцию, чтобы принять ссылки вместо указателей (или же он правильно обрабатывать нулевое значение, передаваемое в?) И просто разыменования указателей на месте вызова.

1

Вы должны либо использовать get() для извлечения основного указателя или изменить прототип использовать смарт-указатели в функции вызовов:

choice = FirstPhase(myCharacter.get(), myEnemy.get(), myInventory.get(), myBoss.get()); 
Смежные вопросы