1

我正在写机械工程的本科论文,但在绘制数据时遇到了麻烦。该项目是使用计算机视觉自动生成真实世界对象的高质量 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;
}
4

2 回答 2

0

这是在源文件而不是头文件中定义模板函数的症状。

模板不是实际功能,它只是构建功能的说明。整个代码需要在您调用它的地方可用,以便编译器可以为您生成正确的函数。如果它没有它,它假设一个在其他地方定义,并让链接器找出它。

于 2012-11-18T19:15:50.617 回答
0

您似乎在问一个经常回答的问题:您在翻译单元中定义了模板,当您实际实例化模板时,编译器看不到它。只要您意识到如果编译器无法找到模板的定义以进行隐式实例化,则需要显式实例化模板。

显式实例化看起来像这样:

template QImage Plotter::plot(vector<double> data, unsigned int width, unsigned int height);
于 2012-11-18T19:17:51.220 回答