gpt4 book ai didi

c++ - 在模板类的复制构造函数中使用默认值时出错

转载 作者:行者123 更新时间:2023-11-28 08:08:30 24 4
gpt4 key购买 nike

我有以下模板类,

template <typename Real>
class Marker {

typedef Wm5::Vector3<Real> Position ;
typedef Wm5::Vector3<Real> Normal ;
typedef Wm5::Vector3<Real> Color ;

public:

Marker(int id = -1, Position position = Wm5::Vector3<Real>::ZERO, Normal normal = Wm5::Vector3<Real>::ZERO, Color color = Wm5::Vector3<Real>::ZERO)
: id_(id), position_(position), normal_(normal), color_(color), cluster_(-1) {}

~Marker() {}

private:

int id_ ;
Position position_ ;
Normal normal_ ;
Color color_ ;
int cluster_ ;

};


template <typename T>
class MarkerSet {

typedef Marker<T> MarkerT ;
typedef std::vector<MarkerT> MarkerVector ;

public:

MarkerSet::MarkerSet(int id = -1, MarkerVector markers = MarkerVector())
{id_ = id; markers_ = markers;}

MarkerSet::~MarkerSet() {}

private:

int id_ ;
MarkerVector markers_ ;

} ;

当我尝试通过以下方式创建 MarkerSet 对象时

MarkerSet<double> markerSet ; 

获取此链接器错误,

error LNK2001: unresolved external symbol "public: __thiscall     MarkerSet<double>::MarkerSet<double>(int,class std::vector<class Marker<double>,class std::allocator<class Marker<double> > >)" (??0?$MarkerSet@N@@QAE@HV?$vector@V?$Marker@N@@V?$allocator@V?$Marker@N@@@std@@@std@@@Z)

如果有人能就我做错的事情向我指出正确的方向,我将不胜感激。

编辑:

好吧,我已经把它缩小到一些相当奇怪的东西。

在 .h 中

  MarkerSet(int id = -1, MarkerVector markers = MarkerVector()) 
{id_ = id; markers_ = markers;}

构建良好

而不是.h

 MarkerSet(int id = -1, MarkerVector markers = MarkerVector()) ;

在.cpp 中

 template <typename T>
MarkerSet<T>::MarkerSet(int id, MarkerVector markers) {

id_ = id ;
markers_ = markers ;

}

按上述方式出错。

有什么想法吗?

最佳答案

您可以尝试使用不同的编译器吗?我试过玩它,下面的 gcc 对我来说很好用。我删除了 Wm5 成员,因为我没有。粘贴 header 和 cpp:

测试.h

#include <vector>

template <typename Real>
class Marker {

public:

Marker(int id = -1,int _position=1)
: id_(id), position(_position){}

~Marker() {}

private:

int id_ ;
int position ;
Real r;

};


template <typename T>
class MarkerSet {

typedef Marker<T> MarkerT ;
typedef std::vector<MarkerT> MarkerVector ;

public:

MarkerSet(int id = -1, MarkerVector markers = MarkerVector())
{id_ = id; markers_ = markers;std::cout<<"Called"<<std::endl;}

~MarkerSet() {}

private:

int id_ ;
MarkerVector markers_ ;

} ;

测试.cpp

#include <iostream>
#include <vector>
#include "test.h"

using namespace std;


int main(int argc, const char **argv) {
cout<<"Hello"<<endl;
MarkerSet<double> ms;
return -1;

}

指令:

bash$ ./test
Hello
Called
bash$

模板类定义需要在头部:

Why do C++ template definitions need to be in the header?

关于c++ - 在模板类的复制构造函数中使用默认值时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9689032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com