2017-04-10 184 views
0

myMain.cpp初始化:C++:的unique_ptr不正確

#include <memory> 
#include "myClass.h" 

static std::unique_ptr<myClass> classPtr; // Error thrown here 
... 

我在全局範圍內初始化,因爲所有的數據加載到這個類的屬性需要一段時間,所以我想這樣做一次,並有該數據一直存在,直到我給出一個明確的命令來刪除它(classPtr.reset(nullptr))。

當我嘗試編譯這個:g++ myMain.cpp -o myMain.o我得到:error: expected initializer before '<' token

爲什麼我得到這個錯誤?

我在myClass.hmyClass.cpp中定義了myClass;我認爲這個錯誤與構造函數有關。我簡化了代碼&,僅包含下面的重要行。

myClass.h

class myClass { 
    std::string dataPath; 
    std::vector<double> data; 
public: 
    myClass(std::string P = "./path/to/data-file.csv"); 
    ~myClass() {} 
    const double findPercentile(double percentile = 0.0); 
} 

編輯:繼從@FrançoisAndrieux我有固定我的構造函數提示。

myClass.cpp

myClass::myClass(const std::string P) : 
      dataPath(P) { 
    // read data-sets into class member variables 
} 
+0

注意與你的問題有關:你聲明你的構造函數爲'myClass(s​​td :: string)',但實現它爲'myClass(const std :: string)'。你定義的參數具有默認值'「./path/to/data-file.csv」',但是你忽略了參數並始終使用默認值進行初始化。 –

回答

2

有兩個顯著的​​問題:

  1. 由於您使用的是gcc 4.8.5,請記住使用標誌-std=c++11否則std::unique_ptr將不可用。

  2. ;結束您的班級定義。在聲明類型時,分號在C/C++中是必需的。由於您沒有使用;,因此您沒有聲明myClass作爲一種類型,因此,由於myClass不是有效類型,因此行static std::unique_ptr<myClass> classPtr;將產生錯誤。

+0

@VladislavMartin你的例子沒有說明你如何初始化'unique_ptr'。如果這是造成你的問題,那麼顯示它就很重要。 –

+0

我無法獲取更新後的示例以產生您描述的錯誤。您需要提供[MCVE]。編寫一個簡短的自包含示例,在編譯和執行時會產生您觀察到的錯誤。 –

+0

@VladislavMartin你還沒有。該示例有一些錯誤,但沒有發現可能會導致您描述的錯誤。修復它們,我能夠無誤地編譯示例。以您提供的示例爲例,將其自身編譯爲新項目。如果您可以重現錯誤,請指出哪一行是由它引起的,以及您正在使用哪種編譯器。 –

0

你對你data成員的初始化值應爲

data(std::vector<double>()) 

或者更簡單地說

data()