在模版类中使用静态std::set或者std::map出现链接错误

shootingstars 2015-07-02 03:10:01

class ClassA
{
};

template < typename T > class TemplateTest
{
public:
static bool getStatus(int i){
return mapint.find(i)==mapint.end()?true:false;
}
static std::set<int> mapint;
};

void TestT()
{
bool b = TemplateTest<ClassA>::getStatus(0);
}

使用vs编译出现如下链接错误
error LNK2001: 无法解析的外部符号 "public: static class std::set<int,struct std::less<int>,class std::allocator<int> > TemplateTest<class ClassA>::mapint"

为啥呢?请假各位大侠。
...全文
273 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ligand 2015-07-03
  • 打赏
  • 举报
回复
楼主的解决办法,从code review是通不过的。本来一个简单的,你的程序的将来的读者(维护者)都很懂的类静态数据成员,被搞成了类静态成员函数的静态局部变量,你是不打算让这个程序具有可读性了? 这叫bloating code。 倒是可以把这个版本代码作为一道改错题,问考生应该如何修改它使之符合通行的C++编程规范。
lniwn 2015-07-03
  • 打赏
  • 举报
回复
1楼的代码不知道有没有实际运行过? 应该是
 std::set<int> TemplateTest::mapint;
而不应该是
static  std::set<int> TemplateTest::mapint;
  • 打赏
  • 举报
回复
1楼正解,你这是变相解决啊,不错不错,就是不知道有没有后遗症
king191923157 2015-07-02
  • 打赏
  • 举报
回复
引用 3 楼 shootingstars 的回复:
To 1楼 2楼: 找到一个解决办法,将静态变量延后获取即可。

class ClassA
{
};

template < typename T > class TemplateTest
{
public:
	static bool getStatus(int i){
		return GetMapint().find(i)==GetMapint().end()?true:false;
	}

	static std::set<int> &GetMapint()
	{
		static std::set<int> mapint;
		return mapint;
	}
};

void TestT()
{
	bool b = TemplateTest<ClassA>::getStatus(0);
}
稍后结贴
楼主自己找到的不错的解决方法
shootingstars 2015-07-02
  • 打赏
  • 举报
回复
To 1楼 2楼: 找到一个解决办法,将静态变量延后获取即可。

class ClassA
{
};

template < typename T > class TemplateTest
{
public:
	static bool getStatus(int i){
		return GetMapint().find(i)==GetMapint().end()?true:false;
	}

	static std::set<int> &GetMapint()
	{
		static std::set<int> mapint;
		return mapint;
	}
};

void TestT()
{
	bool b = TemplateTest<ClassA>::getStatus(0);
}
稍后结贴
幻夢之葉 2015-07-02
  • 打赏
  • 举报
回复
恩,1L对的,你要在类外部对static进行初始化
sdghchj 2015-07-02
  • 打赏
  • 举报
回复
静态成员只有声明没有实现 class ClassA { }; template < typename T > class TemplateTest { public: static bool getStatus(int i){ return mapint.find(i)==mapint.end()?true:false; } static std::set<int> mapint; }; static std::set<int> TemplateTest::mapint; void TestT() { bool b = TemplateTest<ClassA>::getStatus(0); }

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧