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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • luke的使用[通俗易懂]

    luke的使用[通俗易懂]zz网络首次用Luke打开索引文件。Overview里面显示了索引具有的Field数目(以最大的Field为准吧?),还有就是文档的总数和Term即索引词的总数?有时一个关键词,对应于多个文档,所

    2022年8月6日
    5
  • 舵机抖动的解决方法

    舵机抖动的解决方法现象与原因原文链接:https://blog.csdn.net/zenghuanyu_big/article/details/78515309最近用arduino单片机,机械臂一直在不停的抖动。首先,需要知道舵机的使用方法,简单来说,就是给一定时间的高电平,舵机能转动在一定的角度。其实,你只需给舵机一次能转动在一定角度的高低电平,之后只需保持上电状态,理论上舵机能保持不动。但这样极易出现波动…

    2022年4月30日
    132
  • Maven打包——配置文件

    Maven打包——配置文件当我们需要打包一些灵活性(有可能经常修改代码)的代码时,会遇到这样的问题:每次修改代码完以后,得需要重新对代码进行打包,重新上传使用。此时,我们可以将一些经常修改的代码放置在配置文件中,以便灵活修改,修改时,只需在打包好的压缩包中进行配置的修改,保存即可,无需重新打包。…

    2022年5月29日
    156
  • 100个句子记完7000个单词_有趣的童年趣事100字

    100个句子记完7000个单词_有趣的童年趣事100字1.WithmyownearsIclearlyheardtheheartbeatofthenuclearbomb.我亲耳清楚地听到原子弹的心脏的跳动。2.Nextyearthebeardedbearwillbearadearbabyintherear.明年,长胡子的熊将在后方产一头可爱的小崽。3.EarlyIsearchedth

    2022年8月24日
    10
  • idea通过服务器激活破解方法

    idea通过服务器激活破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    156
  • c#数组赋初值_C#数组初始化

    c#数组赋初值_C#数组初始化C#的数组初始化是在声明数组时将初始值放在大括号({})之内。如果没有指定初始值,则数组成员将自动初始化为该数组类型的默认初始值。请阅读数组的属性。如果将数组声明为某类型的字段,则当实例化该类型时它将被设置为默认值null。一、一维数组的初始化1.在声明数组时将其初始化。如:int[]array=newint[6]{1,2,3,4,5,6};string[]stringArray=…

    2022年7月18日
    67

发表回复

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

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