c++禁止隐式转换_无法将int隐式转换为类
2023-06-13 09:14:59 时间
C++有一个很方便的功能—隐式转换,比如有一个函数
void func(double f);
调用它的时候
func(5);
func(5.0);
都是有效的。
但有时候,这个功能就很麻烦了。比如:
class A{
public:
A(const string&v){
///...
}
}
void func(const std::string& v);
void func(const A& v);
编译的时候就会出现错误,因为std::string可以隐式转换为类A对象。
那么如何阻止它呢? C++ 标准有一条规定: “Implicit conversions will be performed […] if the parameter type contains no template-parameters that participate in template argument deduction” (ISO/IEC 14882:1998, section 14.8.1.4). 也就是说,既在模板参数列表中,又在函数参数列表中的类型不会隐式转换。也就是:
template<typename T> func(const T& t, double v);
///参数t不能隐式转换,参数v可以隐式转换
那么就可以如下写代码:
//.h
template<typename T> void func(const T&);
template<> dll_export void func<std::string>(const std::string& v);
template<> dll_export void func<A>(const A& v);
//.cpp
template<> dll_export void func<char*>(const char* s)
{
///...
}
template<> dll_export void func<A>(const A& v)
{
///...
}
这么写就可避免隐式转换了。
另外,c++11标准还添加一些相关内容,十分有用。 比如只想让这个func函数只接受int型的参数,就这么写。
void function(int); // 先声明int型的参数
template <class T>
void function(T) = delete; // C++11 ,禁止生成其他参数的func函数
c++选择函数时优先考虑满足条件的非模板函数,然后才是符合条件的模板函数。在上段代码中,非模板函数function会被优先考虑,而模板function函数被删除,所以不能被调用。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/183127.html原文链接:https://javaforall.cn
相关文章
- c++时间戳转换日期格式_java时间戳转换成时间
- EasyC++88,类模板(一)
- C++ int与string的相互转换(含源码实现)
- 使用C++解决八数码问题
- c++之复合类型笔记(一)
- c++与三菱plc通信_C语言编写的代码是
- C++异常的介绍和分析
- c++深拷贝和浅拷贝
- 2022蓝桥杯(c/c++ B组)-刷题统计
- C++中的引用处理
- C/C++ 进程/线程/模块遍历
- C/C++ Hook 键盘记录器
- 【C++ 语言】面向对象 ( 模板编程 | 函数模板 | 类模板 )
- C++:AVL树
- C++内存管理
- C++字符串和数字转换完全攻略
- 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换
- c++类的隐式转换与强制转换重载详解
- c++与c#的时间转换示例分享
- C++Primer第一部分基本语言
- C++基础入门教程(七):一些比较特别的基础语法总结