读书人

函数满载的一个怪异的现象

发布时间: 2012-09-02 21:00:34 作者: rapoo

函数重载的一个怪异的现象
以下是函数重载的声明:
//--------------------------------
//Summary:
//设置属性值
//Parameters:
//[in] szAttrName - 属性名称
//[in] szAttrValue - 属性值
//--------------------------------
um_ReturnCode SetAttribute(LPCumWSTR szAttrName, LPCumWSTR szAttrValue);
um_ReturnCode SetAttribute(const CumString& strAttrName, um_INT nAttrValue);
um_ReturnCode SetAttribute(const CumString& strAttrName, um_BOOL bAttrValue);
um_ReturnCode SetAttribute(const CumString& strAttrName, um_ID idAttrValue);
um_ReturnCode SetAttribute(const CumString& strAttrName, um_FLOAT fAttrValue);
um_ReturnCode SetAttribute(const CumString& strAttrName, um_DOUBLE dAttrValue);

如果我在CPP文件中这样调用SetAttribute()

pNodeCrossRef->SetAttribute(XML_ATTR_DISPTYPE,0);
或者
pNodeCrossRef->SetAttribute(XML_ATTR_DISPTYPE,(um_INT)0);
都会出现下面的错误:

error C2666: 'CXMLDOMNode::SetAttribute' : 6 overloads have similar conversions
2> f:\office\trunk\__internal\headers\umbase\XMLDOMNode.h(389): could be 'um_ReturnCode CXMLDOMNode::SetAttribute(const CumString &,um_DOUBLE)'
2> f:\office\trunk\__internal\headers\umbase\XMLDOMNode.h(388): or 'um_ReturnCode CXMLDOMNode::SetAttribute(const CumString &,um_FLOAT)'
2> f:\office\trunk\__internal\headers\umbase\XMLDOMNode.h(387): or 'um_ReturnCode CXMLDOMNode::SetAttribute(const CumString &,um_ID)'
2> f:\office\trunk\__internal\headers\umbase\XMLDOMNode.h(386): or 'um_ReturnCode CXMLDOMNode::SetAttribute(const CumString &,um_BOOL)'
2> f:\office\trunk\__internal\headers\umbase\XMLDOMNode.h(385): or 'um_ReturnCode CXMLDOMNode::SetAttribute(const CumString &,um_INT)'
2> f:\office\trunk\__internal\headers\umbase\XMLDOMNode.h(379): or 'um_ReturnCode CXMLDOMNode::SetAttribute(LPCumWSTR,LPCumWSTR)'
2> while trying to match the argument list '(const wchar_t [4], um_INT)'

但是如果我这样写就不会出错:
pNodeCrossRef->SetAttribute(XML_ATTR_DISPTYPE,1);


我的疑问是以下几点:
(1)为什么pNodeCrossRef->SetAttribute(XML_ATTR_DISPTYPE,1);正确,而
pNodeCrossRef->SetAttribute(XML_ATTR_DISPTYPE,0);错误?
(2)为什么强制转换后,pNodeCrossRef->SetAttribute(XML_ATTR_DISPTYPE,(um_INT)0);依然错误?
请问造成以上现象的根源是什么?

[解决办法]
函数重载解析的步骤如下
1 确定函数调用考虑的重载函数的集合确定函数调用中实参表的属性
2 从重载函数集合中选择函数该函数可以在给出实参个数和类型的情况下用调用
中指定的实参进行调用
3 选择与调用最匹配的函数
C++primer 内容貌似好多
[解决办法]
按道理不应该出现楼主说的这种情况
[解决办法]
const CumString& strAttrName 都改为LPCumWSTR szAttrName试试
[解决办法]
换个编译器试试吧。尤其在你说pNodeCrossRef->SetAttribute(XML_ATTR_DISPTYPE, (um_INT)0);
这样都出现问题的时候就可以考虑换个别的编译器试试了。

读书人网 >C++

热点推荐