2016-06-08 96 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然后::然后函数名。

希望这有助于:)

相关问题