2012-02-12 2 views
0

Итак, когда я пытаюсь запустить мой заголовочный файл в Unix, я получаю сообщение об ошибке «Ошибка C2440:« initializing »: невозможно преобразовать из 'std :: vector < _Ty> *' to 'std :: вектор < _Ty> '". Я думаю, что получаю эту ошибку из-за «трансформации», которую я вызываю во всех операциях, но я не уверен. Вот заголовок файла:Неизвестное сообщение об ошибке C2440 в C++

#include <iostream> 
#include <vector> 
#include <string> 
#include <fstream> //library for files 
#include <cctype> 
#include <algorithm> 
#include <iterator> 
#include <sstream> 
#include <typeinfo> 


using namespace std; 

template <class T> 
void alloc3DArray(T *** &x, int numberOfRows, int numberOfColumns,int numberOfDepth ) 
{ 

int i=0; 
int j=0; 
int k=0; 


// allocate an array for array of arrays 
    x = new T ** [numberOfRows]; 


// Allocate an array for each element of the first array 
    for(i = 0; i < numberOfRows; i++) 
    { 

     x[i] = new T *[numberOfColumns]; 

    // Allocate an array of T for each element of this array 
     for(j = 0; j < numberOfColumns; j++) 
     { 

      x[i][j] = new T [numberOfDepth]; 

    // Specify an initial value 
    for(int k = 0; k < numberOfDepth; ++k) 
    { 
    x[i][j][k] = -1; 


    } 


     } 
    } 

} 

template <class T> 
void dealloc3DArray(T *** &x, int numberOfRows, int numberOfColumns) 

{ 
// Check if it exeists 
if(!x) //it does not exist 
     exit(1); 



    for (int i = 0; i < numberOfRows; ++i) 
    { 
    for (int j = 0; j < numberOfColumns; ++j) 

     { 
    //delete innest 
      delete [] x[i][j]; 
     } 

    //delete columns 
     delete [] x[i]; 
    } 
//delete first array 
    delete [] x; 
} 

template <class T> 
const vector<T> allOperationsNotWorking(T *** &myArray1, T *** &myArray2, T *** &myArray3,int numberOfRows, int numberOfColumns,int numberOfDepth ) 

{ 
    int i=0; 
int j=0; 
int k=0; 

    int size = numberOfRows * numberOfColumns * numberOfDepth; //find vector size 
    vector<T> &myvector = vector<T>(size);// create a vector 
    //vector<T>::const_iterator it;// const_iterator is faster than iterator 
    for(i = 0; i < numberOfRows; i++) 
    for(j = 0; j < numberOfColumns; j++) 
    for(k = 0; k < numberOfDepth; k++){ 

    myArray3[i][j][k] =myArray1[i][j][k]+myArray2[i][j][k]; 

    myvector.push_back(myArray3[i][j][k]); 


    } 
    return myvector; 


} 

vector<string> allOperationsString(string *** &myArray1, string *** &myArray2, string *** &myArray3,int numberOfRows, int numberOfColumns,int numberOfDepth ) 

{ 
    int i=0; 
int j=0; 
int k=0; 

    int size = numberOfRows * numberOfColumns * numberOfDepth; //find vector size 
    vector<string> myvector = vector<string>(size);// create a vector 
    //vector<T>::const_iterator it;// const_iterator is faster than iterator 
    for(i = 0; i < numberOfRows; i++) 
    for(j = 0; j < numberOfColumns; j++) 
    for(k = 0; k < numberOfDepth; k++){ 

    myArray3[i][j][k] =myArray1[i][j][k]+myArray2[i][j][k]; 

    myvector.push_back(myArray3[i][j][k]); 


    } 
    return myvector; 


} 

template <class T> 
vector<T> isWord(vector<T> &stringVector, vector<T> &goodOnes,vector<T> &badOnes, vector<T> &dict) 
{ 
    vector<int> strV; 


if (typeid(stringVector).name()== typeid(strV).name()){ 

//if (typeid(stringVector)==int){ 
    ofstream badFile; // declare and object as output file using ofstream 
    cout << " Illegal Vector" << endl; 
    badFile.open ("hw1bout2.txt", ios::app); 
    badFile << "Illegal Vector" << endl; 
    badFile.close(); 
    return badOnes; 
    } 

int i=0; 
int j=0; 
int FIRSTSIZE=stringVector.size(); 
int SECONDSIZE = dict.size(); 
std::string sInput=""; 
std::string sDict=""; 

sort(stringVector.begin(), stringVector.end());//sort() uses quicksort from the algorith library 

    for(int i=0, j=0; i < FIRSTSIZE && j < SECONDSIZE;){ 
    sInput=stringVector[i]; 


    std::transform(sInput.begin(), sInput.end(), sInput.begin(), std::toupper); //convert input word to upper 

    sDict=dict[j]; 


    if(sInput.compare(sDict) == 0) { 
    goodOnes.push_back(stringVector[i]); //write good word to vector 

    i++;//advance one position in string vector 
    j++;//advance one position in dictionary 
    } 

    else if(stringVector[i] < dict[j] && FIRSTSIZE < SECONDSIZE){// wrods did not match 
    if (stringVector[i].size() >0) badOnes.push_back(stringVector[i]); //write bad word to vector if not empty string 
    i++;//advance one position in string vector 
    } 

    else{ 
    j++;//advance one position in dictionary 
    } 
} 



return goodOnes; 
} 

template<class T >  
vector<string> isWord(vector<int> &stringVector, vector<string> &goodOnes,vector<string> &badOnes, vector<string> &dict) 
{ 

vector<int> strV; 


if (typeid(stringVector).name()== typeid(strV).name()){ 

    badOnes.push_back("Illegal Vector"); 
} 
    return badOnes; 

} 

//template<class T> 
vector<int> allOperations(int *** &myArray1, int *** &myArray2, int *** &myArray3,int numberOfRows, int numberOfColumns,int numberOfDepth ) 

{ 
    int i=0; 
int j=0; 
int k=0; 

    int size = numberOfRows * numberOfColumns * numberOfDepth; //find vector size 
    vector<int> myvector = vector<int>(size);// create a vector 
    //const vector<int>& myvector; 
    //vector<int>::const_iterator it = myvector.begin(); 
    vector<int>::const_iterator it;// const_iterator is faster than iterator 
    for(i = 0; i < numberOfRows; i++) 
    for(j = 0; j < numberOfColumns; j++) 
    for(k = 0; k < numberOfDepth; k++){ 

    myArray3[i][j][k] =myArray1[i][j][k]+myArray2[i][j][k]; 

    myvector.push_back(myArray3[i][j][k]); 


    } 
    return myvector; 


} 
+0

Это компилируется для меня в MSVS2008, но на ideone это не так. Weird. –

+0

Это помогло бы (а), если бы у вас был меньший фрагмент, и (б) рассказал нам, какие строки (а) он специально жаловался. – Joe

+3

Обязательная ссылка на [трехзвездочный программист] (http://c2.com/cgi/wiki?ThreeStarProgrammer) –

ответ

1

Действительное сообщение об ошибке получил от г ++, который не является тот, который вы в курсе, довольно ясно указывает на то, что последний параметр std::transform это имя перегруженной функции.

Поскольку этот параметр используется для вычитания аргумента шаблона, компилятор не имеет возможности выбрать какую-либо из перегрузок. Мы поможем его, называя коллекцию перегруженных функций в сильно типизированных контексте:

char (*transformation_fn)(char) = &std::toupper; 
std::transform(sInput.begin(), sInput.end(), sInput.begin(), transformation_fn); 

С этим изменением, the code compiles without errors.

Смежные вопросы