我有一个程序,其代码可以完美地运行,但编译器仍会输出这个恼人的警告:
warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
我的程序的简化版本是:
#include <iostream>
#include <iomanip>
class point
{
public:
point( int x = 0, int y = 0 )
: _x( x ), _y( y )
{}
point( const point &p )
: _x( p._x ), _y( p._y )
{}
int & x( ) { return _x; }
int & y( ) { return _y; }
private:
int _x, _y;
};
class matrix
{
public:
int operator()( int x, int y ) const
{ return _array[ index( x, y ) ]; }
int operator()( point< int > p ) const
{ return operator()( p.x( ), p.y( ) ); }
int operator()( int x, int y, int value )
{
_array[ index( x, y ) ] = value;
return _array[ index( x, y ) ];
}
int operator()( point< int > p, int value )
{ return operator()( p.x( ), p.y( ), value ); }
private:
int _array[ 4 * 5 ];
int index( int x, int y ) const
{ return y * Width + x; }
};
int main( )
{
std::cout << "Filling matrix." << std::endl;
matrix< int, 4, 5 > m;
for ( int y = 0; y < 5; ++y )
for ( int x = 0; x < 4; ++x )
{
m( x, y, ( y * 4 + x ) );
}
std::cout << "Reading matrix." << std::endl;
for ( int y = 0; y < 5; ++y )
{
std::cout << std::endl << "|";
for ( int x = 0; x < 4; ++x )
{
std::cout << std::setw( 3 ) << std::setfill( ' ' ) << m( x, y ) << " |";
}
}
std::cout << std::endl << "Done." << std::endl;
}
我看不出我的operator()
重载出了什么问题。
有什么想法吗?
答案 0 :(得分:0)
那么,
我花了一些时间来弄清楚这个警告的实际原因。由于我的程序运行正常,我直到今天才忽略了警告,我认为分享它会很有用,这样世界各地的其他人都可以节省一些时间。
在对operator()
构造进行大量修补之后,我决定看一看,并想知道为什么我的编译器会将单个值与point
混淆并将第二个参数作为{{1} }}
我发现我懒得为我的value
构造函数添加默认值,所以我也可以将它用作默认构造函数。
当我添加这个默认值时,我没注意任何人都可以通过省略第二个参数来使用这个构造函数,这导致了我的错误。
只是为了好笑,我改变了我的构造函数如下:
point
然后我可以尝试我的解决方案,然后用以下方法清理它:
#ifdef AMBIGUOUS
point( int x = 0, int y = 0 )
#else
point( )
: point( 0, 0 ) {}
point( int x, int y )
#endif
确定。在后者编译时没有问题:
> g++ ambig_param.cpp -o ambig_param -Wall -std=c++14
我希望有一天能帮助别人。