模板函数-类型检查错误- c++
template function - type checking error - c++
我有这个函数模板
template < class TParam >
bool greaterThan (TParam A, TParam B) {
if (typeid(TParam) == typeid(string)) {
return A.compare(B) > 0; <--------------- Error
} else {
return A > B;
}
}
但是编译器不允许我对int
使用这个。
Member reference base type 'int' is not a structure or union.
如果我在int
上调用函数,if语句不会运行。
我把它注释掉并检查了。我不知道怎么了
当TParam
为int
时,有:
A.compare(B)
您正在尝试调用int
的compare
方法。这种方法是不存在的。你需要的是模板专门化,这样当类型是特定类型时,你可以让模板做一些特别的事情:
template<class TParam>
bool greaterThan(TParam A, TParam B) {
return A > B; // this will be called for any type except string because of
// our following specialisation
}
// make a specialisation for when the template parameter is string
template<>
bool greaterThan<string>(string A, string B) {
return A.compare(B) > 0;
}
语法有点陌生,但如果你仔细阅读它,模板专门化是对模板的一个非常强大的补充。
请注意,string
确实有operator<
,所以如果你不想的话,你甚至不需要专门化它,但这是一个学习模板专门化的好机会。
您知道您不是在int
上调用compare
,但编译器不会:您的if
在运行时求值。
由于string
是模板中唯一的特例,请尝试:
template < class TParam >
bool greaterThan (TParam A, TParam B) {
return A > B;
}
bool greaterThan(const string& a, const string& b) {
return a.compare(b) > 0;
}
模板代码是在编译时生成的,所以if()语句还没有执行。
有两个解决方案
a)为int的
提供一个特殊版本的模板b)不要使用Compare(),并要求struct/classes提供比较操作符
调用模板函数会导致编译器实例化整个函数,导致错误的语句显然不适用于int
参数。有几种方法可以区分这两种情况:
首先,对字符串使用greaterThan
的专门化:
template < class TParam >
bool greaterThan (TParam A, TParam B) {
return A > B;
}
template<>
bool greaterThan< string > (string A, string B) {
return A.compare(B) > 0;
}
第二,对字符串使用greaterThan
的重载:template < class TParam >
bool greaterThan (TParam A, TParam B) {
return A > B;
}
bool greaterThan (string const & A, string const & B) {
return A.compare(B) > 0;
}
在这两个选项中,在编译时决定调用哪个函数,而不是在运行时检查类型。但是请注意,重载接受引用的形参,而专门化接受值的形参,因为它必须完全匹配基模板函数的签名。
同样,对于特化,编译器选择的函数有时可能是意外的。由于函数模板只能显式专门化(即不能部分专门化),重载提供了与专门化相关的所有优点而没有缺点。
参见Herb Sutter的"为什么不特化函数模板?"获取更多信息。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'