2016-06-08 93 views
1

這是我在OpenCV教程中找到的一段代碼(來源https://github.com/Itseez/opencv/blob/master/samples/cpp/tutorial_code/core/file_input_output/file_input_output.cpp)。由於代碼全部在一個文件中,我嘗試將它分離爲標題和cpp。我的問題是我無法找到如何正確地做到不生成錯誤C4430:缺少類型說明符 - int假定。注意:C++不支持default-int。如何將構造函數明確聲明爲單獨的.h&.cpp文件?

class MyData 
{ 
public: 
MyData() : A(0), X(0), id() {} 
explicit MyData(int) : A(97), X(CV_PI), id("mydata1234") // explicit to avoid implicit conversion 
{} 
void write(FileStorage& fs) const //Write serialization for this class 
{ 
fs << "{" << "A" << A << "X" << X << "id" << id << "}"; 
} 

public: // Data Members 
int A; 
double X; 
string id; 
}; 

所以這是我停留在一部分:我試過

MyData() : A(0), X(0), id() {} 
explicit MyData(int) : A(97), X(CV_PI), id("mydata1234") // explicit to 

的聲明(頭文件):

class MyData 
{ 
    public: // Data Members 
     int A; 
     double X; 
     std::string id; 

     MyData() ; 
     explicit MyData(int); 

    void write(cv::FileStorage& fs) const; 
    void read(const cv::FileNode& node); 
}; 

#endif 

中的.cpp事情

MyData::MyData() : A(0), X(0), id() {} // this is simple 

但接下來呢?

MyData::MyData(int) : 
    A(97), X(CV_PI), id("mydata1234") {}; 
MyData::write(cv::FileStorage& fs) const 
{ // ... it will stuck here C4430 
} 

使用Visual Studio 2010

+1

在構造函數中的int參數的目的是什麼? – Ajay

+0

檢查原始代碼:'// read'和'// write'閱讀#132:'MyData m;'write#77:'MyData m(1);'數字1表示我們將使用一個字符串「文件寫入操作期間的「mydata1234」。在閱讀過程中,我們將從文件'fs [「MyData」] >> m;'#137(?)'中讀取一些特定的東西。據我瞭解原始代碼。所以你可以傳遞任何東西給構造函數或傳遞int。我不知道作者爲什麼這樣寫,但我希望按照他的意圖去做,但將其分配給兩個文件。 –

回答

1

要增加身體爲你write方法的類定義的格式之外:

return-type classname::methodname(parameters) 
{ 
} 

因此,在這種情況下:

void MyData::write(cv::FileStorage& fs) const 
{ 

} 
+0

所以你基本上建議從聲明中刪除「顯式」。這不是我想要的。 –

+0

@JohnBoe,這是解決你的'寫'函數,而不是你的顯式構造函數 – vu1p3n0x

+0

@JohnBoe不,我不知道。你需要添加'void'。您不必爲您的實現添加「顯式」,只能在您的聲明中添加。我從來沒有說過你必須刪除它。 –

1
MyData::write(cv::FileStorage& fs) const 
{ // ... it will stuck here C4430 
} 

C4430是 「缺少類型說明符」。這是因爲MyData::write()實現不包含返回類型。只有構造函數應該省略返回類型。將其更改爲void MyData::write(cv::FileStorage& fs) const以匹配其聲明。

1

在您的HPP當你宣佈它應該是這樣的事情:

class Name{ 
.....some other functions .... 
void write(cv::FileStorage& fs); 
}; 

並在你的cpp你需要先包括喲烏爾HPP然後:

void Name::write(cv::FileStorage& fs) 
{ 
    .......body... 
} 

所以首先說功能可按(在這種情況下void)的類型,然後命名的class然後::然後函數名。

希望這有助於:)

相關問題