0

デフォルトで曖昧な過負荷およびコンストラクタ:C++、私は単純に完璧に動作しますが、コンパイラは、まだこの迷惑な警告出力コードでプログラムを持っている

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: 

私のプログラムのsimplyfiedバージョンは次のとおりです。

#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

よく、

この警告の実際の理由を理解するのにしばらく時間がかかりました。私のプログラムは正常に動作していたので、今日まで警告を無視していたので、世界中の他の人が時間を節約できるように共有することが有用だと思った。私は逆さま見てみると、なぜ私のコンパイラはpointで単一の値を混乱とvalueように、第2引数を取ることになるだろうことを決めたoperator()構造の周りいじりの多くの後

そして私はpointコンストラクタのデフォルト値を怠惰に追加しているので、デフォルトコンストラクタとしても使用できるようになりました。 このデフォルトを追加したとき、私は誰もこのコンストラクタを2番目の引数だけを省略して使用でき、これが私のエラーにつながったことに注意していませんでした。

**危険にさらされていること!

#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 

[OK]をクリックします。後で問題なくコンパイルします。

> g++ ambig_param.cpp -o ambig_param -Wall -std=c++14 -DAMBIGUOUS 
ambig_param.cpp: In function ‘int main()’: 
ambig_param.cpp:68:66: 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: 
    std::cout << std::setw(3) << std::setfill(' ') << m(x, y) << " |"; 
                   ^
ambig_param.cpp:27:4: note: candidate 1: T matrix<T>::operator()(T, T) const [with T = int] 
    T operator()(T x, T y) const 
    ^~~~~~~~ 
ambig_param.cpp:39:4: note: candidate 2: T matrix<T>::operator()(point<int>, T) [with T = int] 
    T operator()(point<int> p, T value) 
    ^~~~~~~~ 

私は誰かを助けることを願っています。

関連する問題