タグ付けされた質問 「overload-resolution」

11
非constメソッドがプライベートのときにpublic constメソッドが呼び出されないのはなぜですか?
このコードを考えてみましょう: struct A { void foo() const { std::cout << "const" << std::endl; } private: void foo() { std::cout << "non - const" << std::endl; } }; int main() { A a; a.foo(); } コンパイラエラーは次のとおりです。 エラー: 'void A :: foo()' is private`。 しかし、私がプライベートのものを削除すると、それはうまくいきます。非constメソッドがプライベートのときにpublic constメソッドが呼び出されないのはなぜですか? 言い換えると、なぜ過負荷解決がアクセス制御の前に来るのですか?これは奇妙です。一貫していると思いますか?コードが機能してからメソッドを追加しましたが、機能しているコードがまったくコンパイルされません。

5
メソッドを追加することで曖昧な呼び出しに関与しない場合に、あいまいな呼び出しを追加する理由
私はこのクラスを持っています public class Overloaded { public void ComplexOverloadResolution(params string[] something) { Console.WriteLine("Normal Winner"); } public void ComplexOverloadResolution<M>(M something) { Console.WriteLine("Confused"); } } 私がそれをこのように呼ぶと: var blah = new Overloaded(); blah.ComplexOverloadResolution("Which wins?"); Normal Winnerコンソールに書き込みます。 しかし、別のメソッドを追加した場合: public void ComplexOverloadResolution(string something, object somethingElse = null) { Console.WriteLine("Added Later"); } 次のエラーが発生します。 呼び出しは次のメソッドまたはプロパティ間であいまいです:> ' Overloaded.ComplexOverloadResolution(params string[])'および …

3
変換演算子のこのオーバーロードが選択されるのはなぜですか?
次のコードを検討してください。 struct any { template <typename T> operator T &&() const; template <typename T> operator T &() const; }; int main() { int a = any{}; } ここで、2番目の変換演算子は、過負荷の解決によって選択されます。どうして? 私の理解する限り、2つの演算子はそれぞれoperator int &&() constとに推定されoperator int &() constます。どちらも実行可能な関数のセットに含まれています。[over.match.best]を読んでも、後者が優れている理由を理解するのに役立ちませんでした。 なぜ後者は前者よりも機能が優れているのですか?

3
C ++が2番目のテンプレート引数を推測しないようにするにはどうすればよいですか?
私はC ++ライブラリ(strf)を使用していますが、その中には、次のコードが含まれています。 namespace strf { template <typename ForwardIt> inline auto range(ForwardIt begin, ForwardIt end) { /* ... */ } template <typename Range, typename CharT> inline auto range(const Range& range, const CharT* sep) { /* ... */ } } 今、strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)私のコードで使用したいと思います。しかし、そのようにすると、次のエラーが発生します(CUDA 10.1のNVCCを使用)。 error: more than one instance of …

1
関数の引数としての{}が曖昧にならないのはなぜですか?
このコードを考えてみましょう: #include <vector> #include <iostream> enum class A { X, Y }; struct Test { Test(const std::vector<double>&, const std::vector<int>& = {}, A = A::X) { std::cout << "vector overload" << std::endl; } Test(const std::vector<double>&, int, A = A::X) { std::cout << "int overload" << std::endl; } }; int main() { …

2
多重継承は、疑わしいあいまいな仮想関数の過負荷につながります
この例では、クラスFooとBarはライブラリから提供されています。私のクラスBazは両方から継承します。 struct Foo { void do_stuff (int, int); }; struct Bar { virtual void do_stuff (float) = 0; }; struct Baz : public Foo, public Bar { void func () { do_stuff (1.1f); // ERROR HERE } }; struct BazImpl : public Baz { void do_stuff (float) override {}; }; …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.