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)'

このエラーがどこから来ているのかわかりません。コンパイラが myvector<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

頻繁に回答される問題について尋ねているようです: テンプレートを実際にインスタンス化するときにコンパイラから見えない翻訳単位でテンプレートを定義しました。暗黙的なインスタンス化のためにコンパイラがその定義を見つけられない場合、テンプレートを明示的にインスタンス化する必要があることを理解している限り、それは問題ありません。

明示的なインスタンス化は次のようになります。

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

これは、ヘッダー ファイルではなくソース ファイルでテンプレート関数を定義した場合の症状です。

テンプレートは実際の関数ではなく、関数を構築するための単なる指示です。コンパイラが適切な関数を生成できるように、呼び出した時点でコード全体が利用可能である必要があります。それがない場合は、別の場所で定義されていると想定し、リンカーにそれを理解させます。

于 2012-11-18T19:15:50.617 に答える