使用其他模板的模板专用化

Template specialization using another template

本文关键字:专用 其他      更新时间:2023-10-16

我对模板专用化有问题,这是我的示例代码:

struct Base;
template< class CLASS = Base >
void saySomething( const CLASS &b ) {
std::cout << "I'm base!n";
}
struct Base {
};
template< class CLASS = Base >
struct X : public CLASS {
virtual void print() {
saySomething< CLASS >( *this );
}
};
struct Text : public Base {};
template< size_t size >
struct Number : public Base {};
template<>
void saySomething< Text >( const Text &t ) {
std::cout << "I'm text!n";
}
template< size_t N >
void saySomething< Number< N > >( const Number< N > &n ) {
std::cout << "I'm number<" << N << ">!n";
}
int main() {
X< Text > t;
t.print();
X< Number< 4 > > n;
n.print();
return 0;
}

但是此代码无法编译。原因如下:

错误 C2768:"saySomething":非法使用显式模板参数

编译器将错误专门指向以下行:

template< size_t N >
void saySomething< Number< N > >( const Number< N > &n ) {
std::cout << "I'm Number<" << N << ">!n";
}

我尝试没有在括号中指定类型,如下所示:

template< size_t N >
void saySomething( const Number< N > &n ) {
std::cout << "I'm Number<" << N << ">!n";
}

但最终的结果是:

我是短信!

我是卑鄙的!

当我想要这样的结果时:

我是短信!

我是4号<>!

有没有办法解决这个问题?提前感谢您的任何帮助

您正在尝试对函数模板进行部分专用化,这是不允许的。

在这种特殊情况下,您可以通过编写以下重载来获得所需的效果,以便您拥有Text的完整专用化或Number<N>的重载,如下所示:

template <class CLASS = Base, size_t = 0>
void saySomething( const CLASS &b ) {
std::cout << "I'm base!n";
}
template <>
void saySomething<Text>( const Text &t ) {
std::cout << "I'm text!n";
}
template <class CLASS = Base, size_t N>
void saySomething(const Number<N> &n ) {
std::cout << "I'm number<" << N << ">!n";
}

现在将调用正确的函数。这是一个演示。