c++ 模板 无法解析的外部符号

代码如下:
图片说明
我把所有方法和头文件声明放在Main.cpp里面的话就可以正常云心,但是一旦分离就会出现问题

 1>------ 已启动生成: 项目: Project1, 配置: Debug x64 ------
1>Stack.cpp
1>LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/FORCE”规范)
1>Main.obj : error LNK2019: 无法解析的外部符号 "public: void __cdecl Stack<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::Printf(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?Printf@?$Stack@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@QEAAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z),该符号在函数 main 中被引用
1>Main.obj : error LNK2019: 无法解析的外部符号 "public: __cdecl Stack<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::Stack<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >(void)" (??0?$Stack@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@QEAA@XZ),该符号在函数 main 中被引用
1>C:\Users\Administrator\source\repos\C++Test\x64\Debug\Project1.exe : fatal error LNK1120: 2 个无法解析的外部命令
1>已完成生成项目“Project1.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
 求大佬解答一下,谢
0

3个回答

vs在写模板函数时,头文件和cpp文件不能分离,就是说你头文件里有模板的函数必须在头文件里实现,没有模板的函数可以放到cpp文件实现,模板类也如此

1
MikuLingSSS
MikuLingSSS 卧槽 就为了这个浪费了一天 感觉自己神菜
10 个月之前 回复

通常,对于无法解析外部命令这个问题的处理方法:先关闭程序,再打开,重新生成编译

1
hernofogot
hernoforgot 回复MikuLingSSS: 你可以把.h文件和模板cpp文件放在一起,方便调用,要不然要使用extern,我的编译器也是vs,但是写不出来你这个就直接报错了
10 个月之前 回复
MikuLingSSS
MikuLingSSS 唉 都试过了 关机大发,Debug Release X86 64 都没用 我现在都感觉是不是系统坏了
10 个月之前 回复

模板比较特殊,不能将定义和声明分开。因为模板只有在调用实例的时候才会将模板参数替换为实际参数,生成二进制的字节码。如果定义和声明分开,以你的例子为例,此时生成了Stack.obj和main.obj两个obj文件,但是Stack里面并没有真正使用模板,二进制字节码其实是没有产生的。而mian中需要模板函数的地方只是会调用call,等待链接时链接真正的模板函数的地址;由于main的include里只有生命,没有定义,所以main中也是不可能产生二进制字节码的。等到真正链接的时候,Stack.obj和main.obj都不存在以string为实际模板参数的二进制字节码,所以会报调用失败。解决方法(1)在.h中实现定义,放来类中类外无所谓 ;(2)在.cpp中添加template Stackstack,让编译器在生成Stack,obj的时候实例调用模板生成二进制字节码,这样今后链接就可以找到啦!

1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!