2016-12-04 6 views
1
#include <iostream> 
#include <memory> 

std::unique_ptr<int[]> addElement(int *myNumbers, int sizeOfArray); 
void printArray(int * arr_ptr, int sizeOfArray); 

int main() 
{ 
    const int SIZE = 5; 
    int myNumbers[SIZE] = {18, 27, 3, 14, 95}; 

    std::unique_ptr<int[]> newCopy(new int[SIZE]); 
    newCopy = addElement(myNumbers, SIZE); 

    std::cout << "myNumbers: "; 
    printArray(myNumbers, SIZE); 

    std::cout << "newCopy: "; 
    printArray(newCopy, SIZE + 1); 


    return 0; 
} 

std::unique_ptr<int[]> addElement(int *myNumbers, int sizeOfArray) 
{ 
    std::unique_ptr<int[]> newArray(new int[sizeOfArray + 1]); 

    newArray[0] = 0; 
    for(int i = 0; i < sizeOfArray; i++) 
    { 
     newArray[i + 1] = myNumbers[i]; 
    } 

    return newArray; 
} 

void printArray(int * arr_ptr, int sizeOfArray) 
{ 
    for(int i = 0; i < sizeOfArray; i++) 
    { 
     std::cout << arr_ptr[i] << ' '; 
    } 

    std::cout << std::endl; 
} 

При попытке вызова printArray(newCopy, SIZE + 1); я получаю ошибку компилятора cannot convert 'std::unique_ptr<int []>' to 'int*' for argument '1' to 'void printArray(int*, int)'Переходя unique_ptr <int[]> к функции

Я прочитал несколько подобных вопросов здесь пока я не могу найти решение пропускания int[] и unique_ptr<int[]> функции printArray.


std::cout << "newCopy: "; 
for(int i = 0; i < SIZE + 1; i++) 
{ 
    std::cout << newCopy[i] << ' '; 
} 

ли то, что я хотел бы

std::cout << "newCopy: "; 
printArray(newCopy, SIZE + 1); 

сделать

ответ

1

При попытке вызова printArray(newCopy, SIZE + 1); я получаю ошибку компилятора cannot convert 'std::unique_ptr<int []>' to 'int*' for argument '1' to 'void printArray(int*, int)'

Это потому, что вы пытаетесь передать объект std::unique_ptr<int []> в функцию, которая вместо этого ожидает int*. Но std::unique_ptr<int []> - это другой тип, чем int* и неявно конвертируемый.

Решение: Вместо этого вы должны передать int*. std::unique_ptr - это просто обертка вокруг голого указателя. Если вы посмотрите на документацию std::unique_ptr, вы обнаружите, что он имеет функцию-член std::unique_ptr::get что

возвращает указатель на управляемый объект

+0

Спасибо Вам Http: // эн. cppreference.com/w/cpp/memory/unique_ptr/get – Brandon