我正在尝试编写一个通用函数来序列化为字符串std::vector<cv::Point_<T>>
,并且我希望它对cv::Point2i
和cv::Point2f
都起作用(均为{{1}的typedef }和特定的T)。
函数如下:
cv::Point_<T>
尝试编译此错误将引发“无法识别的模板声明/定义”错误。调查该错误(下面是完整的编译器输出),我发现this question和this question似乎与我的情况无关,而我不知道答案。{3}}。 >
我对模板编程非常陌生,我怀疑该错误是由以下事实引起的:我将本身就是参数之一的模板参数的类型用作模板参数。有人能指出我正确的方向,并可能会解释为什么编译器无法构建此代码吗?
这是编译器在包含我的标头的每个文件中产生的错误输出结果:
1> svinifile.h(640):错误C4430:缺少类型说明符-假定为int。 注意:C ++不支持default-int 1> svinifile.h(640):错误 C2988:无法识别的模板声明/定义 1> svinifile.h(640):错误C2143:语法错误:在“&”之前缺少“,”
第640行是我上面显示的函数定义中template<typename T>
int SVIniFile::write(const std::string& section,
const std::string& key,
std::vector<cv::Point_<T>>& points)
{
std::ostringstream os;
if (points.empty())
{
return SUCCESS;
}
for (size_t j = 0; j < points.size(); j++)
{
os << points[j].x << " " << points[j].y;
if (j < points.size() - 1)
{
os << " ";
}
}
write(section, key, os.str()); // do the writing of os.str() in the right `section` at `key`
return SUCCESS; // function that writes a string into an ini file
}
之后的那一行。
为明确起见,template<typename T>
在OpenCV的2D点类型中将in types.hpp
定义为:
cv::Point_<T>
答案 0 :(得分:1)
由于显示的代码没有问题,因此问题一定出在您未显示的某些代码上。它可能很简单,例如缺少或包含#include。
您应该尝试创建Minimal, Complete, and Verifiable example。这样做时,您可能会发现问题。
例如,在VS 2017上编译就可以了:
#include <vector>
namespace cv {
template<typename _Tp> class Point_ {};
typedef Point_<int> Point2i;
}
class SVIniFile {
public:
template<typename T>
int write(
const std::string& section,
const std::string& key,
std::vector<cv::Point_<T>>& points);
};
template<typename T>
int SVIniFile::write(
const std::string& section,
const std::string& key,
std::vector<cv::Point_<T>>& points) {
return 0;
}
int main() {
SVIniFile svIniFile;
std::vector<cv::Point2i> points;
svIniFile.write("abc", "def", points);
return 0;
}