类函数的模板指定
template specilization of a class function
本文关键字:类函数 更新时间:2023-10-16
我尝试了以下类函数的专用化,但它给了我错误。
enum SpecializedType
{
TypeA,
TypeB
};
class TestFunctionSpecialization
{
public:
template<SpecializedType T> void print(const T& t)
{
}
};
template<> void TestFunctionSpecialization::print<TypeA>(const TypeA& t)
{
}
错误是
../src/TestFunctionSpecialization.h:22:49: error: ‘T’ does not name a type
template<SpecializedType T> void print(const T& t)
^
../src/TestFunctionSpecialization.h:28:65: error: ‘TypeA’ does not name a type
template<> void TestFunctionSpecialization::print<TypeA>(const TypeA& t)
我怎样才能正确地进行这种专业化?
有两种类型的模板参数,您混合使用它们:
键入参数,引入关键字 class
或 typename
。例如:
template <typename T> void foo(T arg) {}
值参数,通过类型引入,例如:
template <int N> int foo() { return N; }
代码将其声明为 value 参数,但随后将其用作类型。这是错误的,编译器是这样说的:
error: ‘T’ does not name a type
我们可以使您的代码进行编译,只需删除参数:
enum SpecializedType
{
TypeA,
TypeB
};
class TestFunctionSpecialization
{
public:
template<SpecializedType T> void print()
{
//T is a constant, not a type
}
};
template<> void TestFunctionSpecialization::print<TypeA>()
{
//no T declared here!
}
但是这个特定的代码似乎非常复杂,为什么不直接传递T
作为普通参数来打印并避免一起使用模板:
void print(SpecializedType t)
{
//use t
}
在template<SpecializedType T> void print(const T& t)
中,T
不是模板类型参数,而是非类型模板参数。您不能将其用作类型,它是一个值。所以你不能写const &T
.
编译器
明确表示你不能做const TypeA& t
,因为TypeA
不是一个类型,而是一个值参数。例如,考虑声明const 10& t
(而不是const int& t
):您尝试做的事情也同样错误。
如果你想要的只是专攻TestFunctionSpecialization::print
,你实际上已经接近成功了。忘记将t
传递给方法。您不需要它,因为您已经传递了一个(模板)参数来告诉编译器要使用哪种方法:
template<> void TestFunctionSpecialization::print<TypeA>()
{
// implementation for the "TypeA" version
}
看看这里的一个简单例子。
相关文章:
- 如何通过派生类函数更改基类中的向量
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 在类函数中初始化外部作用域变量
- c++ 在非类函数中使用类变量
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- 从类成员函数到类 C 函数指针的转换
- 如何在模板类函数中分配结构值?
- 有没有办法将重载的类函数绑定到函数对象?
- 启动类函数作为失去引用的线程
- C++调用使用重写函数的父类函数
- 将值传递到另一个类函数在打印时为零
- 计算对类函数的所有调用次数
- 由于签名差异,调用了错误的子类函数
- 使用宏调用类函数
- 虚拟基类函数中派生类的大小
- 模板类/函数中的交叉前向声明
- 在C++中使用非静态类函数的函数
- 无法访问基类函数 C++
- 类函数返回到另一个类函数返回打印不同的值
- C++ 在外部使用嵌套结构实现类函数