本人在一个类中写了个函数模板(静态的),结果编译报错说无法解析外部符号,该怎么办?
解决方案
5
可以分开啊,这样:
#include<iostream> using namespace std; class Test{ public: template<typename T> static void compare(const T& v1, const T& v2); }; template<typename T> void Test::compare(const T& v1, const T& v2) { if(v1 < v2) cout << "v1 < v2" << endl; if(v1 > v2) cout << "v1 > v2" << endl; } int main() { Test::compare<int>(2, 3); return 0; }
5
“C++要求模板函数的声明和实现对引用:
本人把声明和实现分别写在了.h和.cpp中,然后编译报错说:error LNK2019: 无法解析的外部符号 “public: static void __cdecl Test::compare<int>(int const &,int const &)” (??$compare@H@Test@@SAXABH0@Z),该符号在函数 _main 中被引用:
“C++要求模板函数的声明和实现对引用者必须都可见” 但是不是说 你必须要都放在.h 文件中
函数模板的具体实现 可以另放, 例如你可以写一个.hpp
Test.h:#include<iostream> using namespace std; class Test{ public: template<typename T> static void compare(const T& v1, const T& v2); }; #include "Test.hpp"
Test.hpp:template<typename T> void Test::compare(const T& v1, const T& v2) { if(v1 < v2) cout << "v1 < v2" << endl; if(v1 > v2) cout << "v1 > v2" << endl; }++
PS:有些人不了解不要说不能分开到声明.h, 实现在.cpp,9L说的很对。
只有符合这个条件管你是放在哪里。
放在一起(头文件)一般只是考虑外部调用的情况,仅此而已。