使用其他模板的模板专用化
Template specialization using another template
我对模板专用化有问题,这是我的示例代码:
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";
}
现在将调用正确的函数。这是一个演示。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- .cpp和.h文件中的模板专用化声明
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 调用专用模板时出错"no matching function for call to [...]"
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 模板专用化(按容器):value_type
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 在其他文件中创建类时在 c++ 项目中不起作用
- 类与私有变量的其他类之间的线程安全性
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- GlobalAlloc而不是其他分配方法
- 使用其他模板的模板专用化
- C++模板专用化 - 将其他整数类型委托给uint64_t
- 模板专用化和从其他模板类继承模板类
- 具有可变参数模板参数的部分专用化,后跟其他参数
- X 的任何子类的专用类模板,无需向模板添加其他类型参数
- 模板类和其他类型的模板类专用化
- 将专用基指针强制转换为专用于其他模板参数的派生指针("adding on"专用化)
- 在 MSVC 上编译的模板成员函数专用化的情况,而不是在其他函数上编译的情况