类函数的模板指定

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)

我怎样才能正确地进行这种专业化?

有两种类型的模板参数,您混合使用它们:

键入参数,引入关键字 classtypename 。例如:

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
}

看看这里的一个简单例子。