.cpp和.h文件中的模板专用化声明
Template specialization declaration in .cpp and .h files
我想在.cpp
文件中定义我的模板专用化,而不是在.h
文件中。有什么办法我能做到这一点吗?我正在使用g++编译器
//main.cpp
#include <iostream>
#include <string>
#include "People.cpp"
using namespace std;
int main() {
Spunky <int> obj3(1);
Spunky<char>obj2('y');
return 0;
}
//People.cpp
#include <iostream>
#include "People.h"
using namespace std;
// TEMPLATE SPECIALISATION
template < class T>
Spunky <T>:: Spunky( T x){
cout << x << " is not a character ! " << endl;
}
template <>
Spunky:: Spunky<char> ( char x ) {
cout << x << " is indeed a character"<< endl;
}
//People.h
#ifndef PEOPLE_H
#define PEOPLE_H
using namespace std;
// TEMPLATE SPECIALISATIONS
template < class T>
class Spunky{
public:
Spunky ( T x) ;
};
template <>
class Spunky <char> {
public:
Spunky (char x);
// { cout<< x << "is indeed a character"<<endl; }
};
#endif
编译器错误为:
template argument deduction is only available with -stdC==1z or -std=gnu++1z
我该怎么着手解决这个问题?
template <>
Spunky:: Spunky<char> ( char x ) {
cout << x << " is indeed a character"<< endl;
}
不是用于定义成员方法实现的正确语法。Spunky:: Spunky<char>
是用于定义方法的语法,该方法本身是模板化的,而不是模板化的类,正确的语法是Spunky<char>::Spunky
。
在定义模板成员专业化时,也没有指定template <>
。
因此,完整的定义应该是:
inline Spunky<char>::Spunky( char x ) {
cout << x << " is indeed a character"<< endl;
}
我建议您不要包含.cpp
文件,如果您想将模板实现拆分为两个文件,则为其提供不同的扩展名(有些使用ipp
(。
头文件的正常规则适用于任何#include
,因此using namespace std
是一个非常糟糕的主意,许多人建议根本不要使用using namespace std
。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 专用模板是否需要专用声明?
- 在实例化封闭类模板之后,我们可以声明模板类成员的部分专用化吗
- C++模板专用化中的声明范围
- 显式专用化 - 模板 ID 与任何模板声明都不匹配
- 静态声明专用类的接口指针数组
- 模板类专用化:模板 ID 与任何模板声明都不匹配
- enable_if在类声明之外实现的方法专用化
- 声明一个模板函数,将模板类友元的两个对象(仅)带到这两个专用化
- 为什么在标题上的结构中声明的模板不违反 ODR 并且专用化会违反 ODR
- 类模板专用化的前向声明
- 了解模板的声明、定义和专用化
- 如何为非类型模板类的专用化定义声明之外的方法
- 声明无法解决"实例化后的显式专用化"错误
- 如何声明模板的友元函数的专用化
- C++11:模板专用化的 constexpr 成员的标准参考需要额外声明
- 在友元模板专用化的声明中不允许使用Constexpr
- 在何处声明类成员模板的部分专用化
- 模板类中专用函数的声明
- C++函数模板专用声明和模板参数;无 vs. <> vs. <type>