2013-05-27 15 views
-3

我有一个类A,它有两个实际上被重载的方法foo。该类有点看起来像这样在C++中模糊FunctionOverloading?

class A 
{ 
public: 
    bool foo(int& a); 
    bool foo(size_t& a); 
}; 

bool A::foo(int& a) 
{ 
    return true; 
} 

bool A::foo(size_t& a) 
{ 
    int new_a = a; 
    return foo(new_a); // here Cl throws me warning C4717: 'hweudm::UDMAbstractBaseEntity::SetAttribute' : recursive on all control paths, function will cause runtime stack overflow 
} 

int main() 
{ 
    A aObj; 
    size_t val = 12; 
    aObj.foo(val); 
    return 0; 
} 

从代码看起来并不明确。但编译期间我不想要这个警告。所以任何人都可以告诉我

  1. 为什么我得到这个警告,即使我已经键入铸造size_t为int?
  2. 这是否会成为GCC上的错误而不是警告。
+9

该代码不会编译;请显示您的实际代码。 –

回答

3

代码不正确。转换结果(int)a是一个右值,它不能绑定到左值引用。

唯一会接近的,如果它不是可怕的未定义的行为,会像foo(reinterpret_cast<int &>(a)),但不要这样做,因为它是不正确的。

0

size_t

typedef unsigned int size_t; 

?那么A :: foo(int & a)和A :: foo(size_t & a)是完全一样的东西

+0

不,不是。 'size_t'是一个无符号类型,因为大小不能是负数。 – StoryTeller

+1

不,不! 1.'size_t'是“基本无符号整数类型_的别名”,不一定是'unsigned int'(可能是例如'unsigned long')。 2.即使在一个被定义为typedef的实现中,int&'(即'signed int&')和'unsigned int&'根本就不是同一个东西,它们是2种不同的,不兼容的类型。 –

+0

当编译为64位时,size_t也可能是64位(即无符号long long)。 – Pixelchemist