一个模板链接问题,搞不定,求助

zhcosin 2013-03-10 04:25:45
写了个简单的模板类 Urand<std::size_t N>,但链接通不过,把实现代码 Urand.cpp 合到头文件 Urand.h 中就可以通过链接,但分开却报错,求熟手帮忙诊断一下。

// Urand.h
#ifndef _URAND_H_
#define _URAND_H_

#include <bitset>

namespace zhcosin
{

template<std::size_t UpperBound>
class Urand
{
public:
Urand();
~Urand();

public:
std::size_t operator()();

private:
std::bitset<UpperBound> theBitSet;
};

} // namespace zhcosin

#endif //_URAND_H_


// Urand.cpp
#include "Urand.h"
#include <cstdlib>
#include <ctime>

namespace zhcosin
{

template<std::size_t UpperBound>
Urand<UpperBound>::Urand()
{
srand(time(0));
}

template<std::size_t UpperBound>
Urand<UpperBound>::~Urand()
{

}

template<std::size_t UpperBound>
std::size_t Urand<UpperBound>::operator ()()
{
if (theBitSet.count() == UpperBound)
theBitSet.reset();

std::size_t newVal;
while (theBitSet[newVal = rand() % UpperBound]);
theBitSet[newVal] = true;
return newVal;
}

} // namespace zhcosin


// main.cpp
#include <iostream>
#include "Urand.h"

int main(int argc, char *argv[])
{
zhcosin::Urand<10> a;
for (int i = 0; i < 10; i++)
{
std::cout << a() << ",";
}
std::cout << std::endl;
return 0;
}

链接错误信息如下:
1>------ Build started: Project: Urand, Configuration: Debug Win32 ------
1>Compiling...
1>Urand.cpp
1>Linking...
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall zhcosin::Urand<10>::~Urand<10>(void)" (??1?$Urand@$09@zhcosin@@QAE@XZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: unsigned int __thiscall zhcosin::Urand<10>::operator()(void)" (??R?$Urand@$09@zhcosin@@QAEIXZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall zhcosin::Urand<10>::Urand<10>(void)" (??0?$Urand@$09@zhcosin@@QAE@XZ) referenced in function _main
1>C:\Users\zhcosin\Documents\Visual Studio 2008\Projects\Urand\Debug\Urand.exe : fatal error LNK1120: 3 unresolved externals
1>Build log was saved at "file://c:\Users\zhcosin\Documents\Visual Studio 2008\Projects\Urand\Debug\BuildLog.htm"
1>Urand - 4 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
...全文
114 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhcosin 2013-03-10
  • 打赏
  • 举报
回复
引用 1 楼 mujiok2003 的回复:
模板没有链接,所以其定义要放在头文件。
哦,明白了,灰常灰常感谢,惭愧啊,学了这么久的C++,这个都没搞清楚,汗。
zhcosin 2013-03-10
  • 打赏
  • 举报
回复
引用 1 楼 mujiok2003 的回复:
模板没有链接,所以其定义要放在头文件。
啊?你的意思是模板的定义与实现代码必须在一个文件中,而不能像普通的类那样分头文件和实现文件?
mujiok2003 2013-03-10
  • 打赏
  • 举报
回复
模板没有链接,所以其定义要放在头文件。

64,686

社区成员

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

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