C++能不能在普通类中写函数模板

C++语言 码拜 8年前 (2016-05-02) 956次浏览
本人在一个类中写了个函数模板(静态的),结果编译报错说无法解析外部符号,该怎么办?
解决方案

5

引用:

本人想把函数的实现写在.cpp文件里,然后编译就报错,是不能分开吗?

可以分开啊,这样:

#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说的很对。
只有符合这个条件管你是放在哪里。
放在一起(头文件)一般只是考虑外部调用的情况,仅此而已。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++能不能在普通类中写函数模板
喜欢 (0)
[1034331897@qq.com]
分享 (0)