2015-10-01 120 views
0

當試圖編譯下面的代碼:C++調用模板功能錯誤

int main(){ 

    Array<int> *testArray = new Array<int>(5); 
    testArray->initArray<int>(testArray); 
    testArray->printArray<int>(testArray); 



    return 0; 
} 

使用這個模板:

template<typename T> 
class Array{ 
public: 
    Array(int size){ 
     size = size; 
     data = new T[size]; 
    }; 
    Array<T> addData(T dataToAdd){ 
     Array <T> *tmp = new Array <T> (this->size); 
     tmp = this->data; 
     Array <T> *newData = new Array<T> (this->size + 1); 

     for (int i = 0; i < this->size + 1; ++i){ 
      if (i < this->size){ 
       newData->data[i] = tmp[i]; 
      } 
      else{ 
       newData->data[i] = dataToAdd; 
      } 
     } 
     return newData; 
    }; 
    void initArray(T arrayToInit){ 
     for (int i = 0; i < this->size; ++i){ 
      this->data[i] = i; 
     } 
    }; 
    void printArray(T arrayToPrint){ 
     ostringstream oss; 
     string answer = ""; 

     for (int i = 0; i < arrayToPrint->size; ++i){ 
      oss << arrayToPrint[i] + " "; 
     } 

     answer = oss.str(); 

     cout << answer << endl; 
    }; 

private: 
    int size; 
    T* data; 
}; 

我碰到下面的錯誤在我的INT主要():

「預期初始表達式在'int'之前」

對於我的兩個函數調用(initArray a nd printArray)。我對C++相當陌生,特別是對模板有一點經驗,任何建議都將不勝感激。感謝您的時間。

編輯:謝謝大家的迴應和建設性的批評,感謝大家的幫助,我已經取得了很大的進步。

+0

'initArray ()'應該是'initArray()'但是這是你的問題僅僅是開始。 –

+0

'initArray'和'printArray'的參數沒有用處。他們應該被刪除。 – owacoder

+0

到目前爲止,感謝您的反饋,您發現的任何其他問題都可以幫助您,謝謝! – Biggytiny

回答

0

這裏是改變工作代碼:

#include <string> 
#include <iostream> 
#include <cstdint> 
#include <iostream> 
#include <string> 
#include <sstream> 


using namespace std; 

template<typename T> 
class Array{ 
public: 
    Array(int size){ 
     size = size; 
     data = new T[size]; 
    } 
    Array<T> addData(T dataToAdd){ 
     Array <T> *tmp = new Array <T> (this->size); 
     tmp = this->data; 
     Array <T> *newData = new Array<T> (this->size + 1); 

     for (int i = 0; i < this->size + 1; ++i){ 
      if (i < this->size){ 
       newData->data[i] = tmp[i]; 
      } 
      else{ 
       newData->data[i] = dataToAdd; 
      } 
     } 
     return newData; 
    } 
    void initArray(Array<T>* arrayToInit){ 
     for (int i = 0; i < this->size; ++i){ 
      this->data[i] = i; 
     } 
    } 
    void printArray(Array<T>* arrayToPrint){ 
     ostringstream oss; 
     string answer = ""; 

     //for (int i = 0; i < arrayToPrint->size; ++i){ 
      // oss << data[i] + " "; 
      answer = oss.str(); 

     cout << answer << endl; 
    } 

private: 
    int size; 
    T* data; 
}; 



int main() 
{ 
    string s; 
    double d =9.0; 

    s=d; 

    Array<int> *testArray = new Array<int>(5); 
    testArray->initArray(testArray); 
    testArray->printArray(testArray); 
    return 0; 
} 

變化進行:當你聲明class.No需要再次做其成員函數

模板實例發生。

也不需要追加;在每個成員函數定義之後,只需要類定義。

1

在這種情況下,您不需要<int>來調用該函數。 (思考std::vector<int>,你會寫hoge.push_back(0),而不是hoge.push_back<int>(0)。)

Array::initArrayArray:;:printArray的參數也無效和不必要的。

固定碼(不發出編譯錯誤/警告,但無法正常工作):

#include <iostream> 
#include <string> 
#include <sstream> 
using namespace std; 

template<typename T> 
class Array{ 
public: 
    Array(int size){ 
     size = size; 
     data = new T[size]; 
    }; 
    Array<T> addData(T dataToAdd){ 
     Array <T> *tmp = new Array <T> (this->size); 
     tmp = this->data; 
     Array <T> *newData = new Array<T> (this->size + 1); 

     for (int i = 0; i < this->size + 1; ++i){ 
      if (i < this->size){ 
       newData->data[i] = tmp[i]; 
      } 
      else{ 
       newData->data[i] = dataToAdd; 
      } 
     } 
     return newData; 
    }; 
    void initArray(){ 
     for (int i = 0; i < this->size; ++i){ 
      this->data[i] = i; 
     } 
    }; 
    void printArray(){ 
     ostringstream oss; 
     string answer = ""; 

     for (int i = 0; i < this->size; ++i){ 
      oss << data[i] + " "; 
     } 

     answer = oss.str(); 

     cout << answer << endl; 
    }; 

private: 
    int size; 
    T* data; 
}; 

int main(){ 

    Array<int> *testArray = new Array<int>(5); 
    testArray->initArray(); 
    testArray->printArray(); 



    return 0; 
} 
+0

如果你打算提供額外的改進,你可能會拋棄兩階段初始化,將邏輯移入構造函數。 –

+0

我驚訝於'size = size;'和'tmp = this-> data;'不會產生任何警告或錯誤。 – user4581301