c++禁止隐式转换_无法将int隐式转换为类

c++禁止隐式转换_无法将int隐式转换为类C++有一个很方便的功能—隐式转换,比如有一个函数voidfunc(doublef);调用它的时候func(5);func(5.0);都是有效的。但有时候,这个功能就很麻烦了。比如:classA{public:A(conststring&v){///…}}void…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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.net/183127.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • git基本操作命令和安装

    git基本操作命令和安装

    2021年11月10日
    43
  • iOS开发常用国外网站清单

    iOS开发常用国外网站清单工欲善其事必先利其器,最近发现临时查找一些东西容易浪费时间,花了点时间整理一下常用的网站,方便以后备用。国内的code4app,ui4app,cocoachina,oschina,csdn就不说了,基本上很好用。不过国外网站上的好东西更多,可惜找起来也更费时间,需要整理一下。主要分开发教程、示例项目、UI设计、问题解决几块。开发教程:即便过了入门阶段,还是要

    2022年7月12日
    18
  • JS 中 scrollWidth、scrollHeight、scrollLeft 、scrollTop 详解

    JS 中 scrollWidth、scrollHeight、scrollLeft 、scrollTop 详解1.总述在JS中scrollWidth、scrollHeight、scrollLeft 、scrollTop属性在做一些复杂的交互效果中是非常常用的,因此在本博文中详细的介绍并给出实例。以上的4个属性是成对出现的,因此下面介绍中也成对的介绍,在实例中为了减少代码量,我直接用的id,实际开发中不推荐。2.scrollWidth和scrollHeight2.1概念element…

    2022年7月23日
    8
  • URLEncoder转码问题

    URLEncoder转码问题2019独角兽企业重金招聘Python工程师标准>>>…

    2022年6月18日
    47
  • 搓牙机调试位置讲解_hadoopjps进程不全

    搓牙机调试位置讲解_hadoopjps进程不全1、strace-p[进程号]strace-p1002297strace:Process1002297attachedfutex(0x7fcbb95f3f84,FUTEX_WAIT_PRIVATE,1,NULL可以看到死在了futex(0x7fcbb95f3f84,FUTEX_WAIT_PRIVATE,1,NULL

    2022年9月14日
    2
  • 用java实现笛卡尔积_Java实现笛卡尔积

    用java实现笛卡尔积_Java实现笛卡尔积publicclassSingleton{privatestaticSingletonintance;privateSingleton(){}publicstaticSingletongetInstance(){/**一开始多线程进来,遇到锁,一个线程进去,是为空,new对象;后续线程进入,不为空,不操作;最后直接返回*对象不为/***笛卡尔积工具类….

    2022年7月27日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号