我正在攻读机械工程的本科论文,而且我在绘制数据方面遇到了麻烦。该项目是利用计算机视觉自动生成真实世界物体的高质量CAD模型。
我想将处理过的数据传递给GNUPLOT,以便快速生成图表。我正在使用临时文件来回传递数据。 (注意:如果您知道更简洁的方法,那么请务必指出它。)
每次我尝试编译程序时,都会收到以下错误:
/home/ryan/Code/FullyReversed/fullyreversed.cpp:-1: error: undefined reference
to `QImage fr::Plotter::plot<double>(std::vector<double, std::allocator<double> >,
unsigned int, unsigned int)'
我不明白这个错误的来源。似乎编译器正在用另一个更复杂的结构替换我的vector<double>
简而言之,我将数据传递给Plotter::plot
的方式有什么问题?
void MainWindow::plotData()
{
double i;
vector<double> intensity;
static QImage plot;
for(i=-10;i<10;i+=.1){
intensity.push_back(1/(i*i+1));
}
plot = Plotter::plot(intensity,800,600);
showQ(plot);
}
Plotter
类中:template <typename T>
QImage Plotter::plot(vector<T, allocator<T> > data, unsigned int width, unsigned int height){
// for creating the filename
char buffer[256];
// the file we'll be writing to
ofstream file;
// loop counter
unsigned int i;
// time file generated
time_t ftime = time(NULL);
// generate the filename
sprintf(buffer,"%d.dat",ftime);
// open the file
file.open(buffer);
// write the data to the file
for(i=0;i<data.size();i++){
file << i << " " << data.at(i) << endl;
}
//generate the command
sprintf(buffer,"gnuplot -e \"set terminal png size %d, %d;set output '%d.png';plot sin(x);\"",width,height,ftime);
// call GNUPLOT
system(buffer);
// load the image
sprintf(buffer,"%d.png",ftime);
QImage out = QImage(buffer);
return out;
}
答案 0 :(得分:0)
这是在源文件中定义模板函数而不是头文件的症状。
模板不是实际的功能,它只是构建功能的说明。整个代码需要在您调用它时可用,以便编译器可以为您生成适当的函数。如果它没有它,则假定在其他地方定义了一个并留下链接器来计算它。
答案 1 :(得分:0)
您似乎在询问一个经常回答的问题:您在翻译单元中定义了模板,当您实际实例化模板时,它对编译器是不可见的。只要您意识到如果编译器无法为隐式实例化找到其定义,则需要显式实例化模板,这是可以的。
显式实例化看起来像这样:
template QImage Plotter::plot(vector<double> data, unsigned int width, unsigned int height);