在静态库中使用 OutputIterator 时出现链接器错误
Linker error when using OutputIterator in a static library
我尝试搜索类似的问题,但没有找到可以帮助我解决问题的讨论帖。如果我错过了提前抱歉!
即使我有使用其他语言(例如 Java 的经验并且我使用的是 Visual Studio Express 2015,我还是 C++ 的新手。
所以,我有一个 class 执行一些集合计算。使用输出迭代器的想法来自这个 我从中复制了代码的结构。
header 看起来像这样:
#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]);
}
现在,class 打包在一个静态库中,该库正确链接到另一个项目,我在其中这样称呼它:
#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
现在,虽然我可以使用 "more traditional" return 值来解决错误,但我不明白是什么原因造成的,也不知道为什么会这样。我说该库已正确链接,因为我可以毫无问题地使用该库的所有其他 functions/objects/classes,但如果我使用这个库,则会出现错误。谁能帮我澄清一下?
非常感谢。
在头文件而不是源文件中定义模板函数:Why can templates only be implemented in the header file?
我们都在某个时间点上^^
我尝试搜索类似的问题,但没有找到可以帮助我解决问题的讨论帖。如果我错过了提前抱歉!
即使我有使用其他语言(例如 Java 的经验并且我使用的是 Visual Studio Express 2015,我还是 C++ 的新手。
所以,我有一个 class 执行一些集合计算。使用输出迭代器的想法来自这个
header 看起来像这样:
#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]);
}
现在,class 打包在一个静态库中,该库正确链接到另一个项目,我在其中这样称呼它:
#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
现在,虽然我可以使用 "more traditional" return 值来解决错误,但我不明白是什么原因造成的,也不知道为什么会这样。我说该库已正确链接,因为我可以毫无问题地使用该库的所有其他 functions/objects/classes,但如果我使用这个库,则会出现错误。谁能帮我澄清一下?
非常感谢。
在头文件而不是源文件中定义模板函数:Why can templates only be implemented in the header file?
我们都在某个时间点上^^