Questions tagged «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()”是私有的。 但是,当我删除私有文件时,它就可以工作。当非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[])'和' Overloaded.ComplexOverloadResolution<string>(string)' …

3
为什么选择这种转换运算符的重载?
考虑下面的代码。 struct any { template <typename T> operator T &&() const; template <typename T> operator T &() const; }; int main() { int a = any{}; } 此处,第二个转换运算符由过载分辨率选择。为什么? 据我了解,这两个运算符分别推导为operator int &&() const和operator int &() const。两者都在可行的功能集中。通读[over.match.best]并没有帮助我弄清楚为什么后者更好。 为什么后一种功能比前一种更好?

3
如何防止C ++猜测第二个模板参数?
我正在使用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 …

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() { …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.