Ошибка компоновщика при использовании OutputIterator в библиотеке stati c - PullRequest
0 голосов
/ 23 января 2020

Я пытался найти похожие проблемы, но не нашел темы, которая могла бы помочь мне решить мою проблему. Извините, если я пропустил это заранее который выполняет некоторые наборы вычислений. Идея использования выходного итератора исходит из этой SO topi c, из которой я скопировал структуру кода.

Заголовок выглядит следующим образом:

#pragma once
#include <tuple>
#include <vector>
#include <iterator>

using namespace std;

class SomeComputation
{
public:
    SomeComputation(void);
    ~SomeComputation(void);


    template <typename Range1, typename Range2, typename Range3, typename OutputIterator>
    void compute(Range1 const & r1, Range2 const &r2, Range3 const & r3, OutputIterator out);
};

Реализация выглядит следующим образом:

#include "SomeComputation.h"
using namespace std;

SomeComputation::SomeComputation(void)
{
// build the object
}

SomeComputation::~SomeComputation(void)
{
// destroy it
}
template <typename Range1, typename Range2, typename Range3, typename OutputIterator>
void SomeComputation::compute(Range1 const & r1, Range2 const &r2, Range3 const & r3, OutputIterator out) {

// do some set computation here
// then save the result using the output iterator
*out++ = std::make_tuple([OMISSIS]);
}

Теперь класс упакован в библиотеку stati c, которая правильно связана с другим проектом, в котором я называю это следующим образом:

#include <vector>
#include <tuple>
#include <iterator>
#include <SomeComputation.h>

using namespace std;
    void MyClass::myFunction(){
    // init data (please assume that 
    //minQ1, maxQ1, etc. are double vars correctly initialized)
        vector<double> rQ0q1;
        rQ0q1.push_back(minQ1);
        rQ0q1.push_back(maxQ1);
        vector<double> rQ0q2;
        rQ0q2.push_back(minQ2);
        rQ0q2.push_back(maxQ2);
        vector<double> rQ0r3;
        rQ0r3.push_back(minR3);
        rQ0r3.push_back(maxR3);
        SomeComputation s = SomeComputation();
        vector<tuple<double, double, double>> result;
        s.compute(rQ0q1, rQ0q2, rQ0r3, std::back_inserter(result));
    }

Тем не менее, я получаю следующую ошибку компоновщика LNK2019:

Error   LNK2019 unresolved external symbol "public: void __thiscall SomeComputation::compute<class std::vector<double,class std::allocator<double> >,class std::vector<double,class std::allocator<double> >,class std::vector<double,class std::allocator<double> >,class std::back_insert_iterator<class std::vector<class std::tuple<double,double,double>,class std::allocator<class std::tuple<double,double,double> > > > >(class std::vector<double,class std::allocator<double> > const &,class std::vector<double,class std::allocator<double> > const &,class std::vector<double,class std::allocator<double> > const &,class std::back_insert_iterator<class std::vector<class std::tuple<double,double,double>,class std::allocator<class std::tuple<double,double,double> > > >)" (??$compute@V?$vector@NV?$allocator@N@std@@@std@@V12@V12@V?$back_insert_iterator@V?$vector@V?$tuple@NNN@std@@V?$allocator@V?$tuple@NNN@std@@@2@@std@@@2@@SomeComputation@@QAEXABV?$vector@NV?$allocator@N@std@@@std@@00V?$back_insert_iterator@V?$vector@V?$tuple@NNN@std@@V?$allocator@V?$tuple@NNN@std@@@2@@std@@@2@@Z) referenced in function "public: void __thiscall ModelData::addDataAtFrame(int,class Vector,class Vector)" (?addDataAtFrame@ModelData@@QAEXHVVector@@0@Z)   [path and project name omitted] 1

Теперь, хотя я могу устранить ошибку, используя «более традиционное» возвращаемое значение, я не понимаю, что его вызывает и почему это происходит. Я говорю, что библиотека правильно связана, потому что я могу без проблем использовать все остальные функции / объекты / классы библиотеки, но если я использую эту, я получаю ошибку. Может кто-нибудь, пожалуйста, помогите мне прояснить это?

Большое спасибо.

1 Ответ

0 голосов
/ 23 января 2020

Определите вашу функцию шаблона в файле заголовка, а не в исходном файле: Почему шаблоны могут быть реализованы только в файле заголовка?

Мы все находимся в этот момент в какое-то время ^^

...