2013-10-26 88 views
1

我試圖用一個單獨的函數從文件中讀取一些數據值;我收到兩個錯誤(我沒有使用C++在很長一段時間......):返回一個數組作爲指針

double * FREAD(std::string fpath){ 
std::string line; 
double * params = new double[14]; 


std::ifstream parameters (fpath); 
if (parameters.is_open()) 
{ 
    for (int b = 0; b < 14; b++) { 
     parameters >> line >> params[b]; 

    } 
} 
    parameters.close(); 



return params; 

} 

拋出

錯誤C2556: '雙* FREAD(的std :: string)' : 'FREAD'::重載函數僅通過從返回類型 '雙FREAD(的std :: string)'

錯誤C2040的區別 '雙*(的std :: string)'與'double(std :: string)'有間接的級別差異

第二個問題是從我調用main函數的那一行引發的。

double * param = FREAD(parampath); 

錯誤C2440:「初始化」:無法從「雙師型」作爲一種價值指向的雙重轉換爲「雙*」

如果我不定義PARAM的,我得到相反的類型不匹配錯誤...

我的理解是,我應該返回一個指針,它指向我的子函數創建的數組的第一個值,並使用它來處理數據。但當我在main中調用函數時,我似乎無法拉出這個值。

+2

只需返回一個'std :: vector '或一個'std :: array '。 – juanchopanza

+0

這個刪除在返回後會被叫做*嗎? – ChiefTwoPencils

+0

@BobbyDigital當然不是,但至少滿足編譯器,...... –

回答

6

這樣做會返回一個容器,例如

#include <array> 

std::array<double,14> FREAD(const std::string& fpath) 
{ 
    std::string line; 
    std::array<double, 14> params; 
    // .... fill params 
    return params; 
} 

關於超載錯誤的最簡單和很簡單的方法,你不能返回類型重載函數。它看起來像編譯器看到這兩個聲明:

double * FREAD(std::string fpath); 
double FREAD(std::string fpath); 

鑑於上述建議,您應該刪除它們無論如何。

1

你的error C2556是因爲你顯然有另一個返回別的東西的FREAD()函數。該錯誤告訴您,您不能僅基於返回類型重載函數。

從消息去,在我看來,你有兩個功能:

  • double * FREAD(std::string fpath)
  • double FREAD(std::string fpath)

你只發布了第一個。

如果C++採用不同的參數(或成員函數的const -ness),則只允許您使用兩個具有相同名稱的函數。你應該爲你的函數提供不同的名字,或者傳遞一個令牌參數,編譯器可以用它來告訴你想要哪一個。

+0

我沒有更新我的函數原型,謝謝。 – user1558168

+0

也會這樣做。 – Adam