标签: overloading

方法重载返回值

在C#中,我需要能够定义一个方法,但让它返回一个或两个返回类型.我尝试这样做时编译器给出了一个错误,但为什么不知道我需要调用哪种方法呢?

int x = FunctionReturnsIntOrString();
Run Code Online (Sandbox Code Playgroud)

为什么编译器会阻止我使用具有不同返回类型的两个函数?

c# overloading

19
推荐指数
4
解决办法
2万
查看次数

Ruby中具有相同名称和不同参数的方法

我有这个代码:

def setVelocity (x, y, yaw)
  setVelocity (Command2d.new(x,y,yaw))
end
def setVelocity (vel)
......
end 
Run Code Online (Sandbox Code Playgroud)

vel是一个Command2D类,有3个属性,可比较和定义+,基本上是一个方便的类来管理这3个属性,所以我想在我的库内部使用它(不想让它们变成私有的,要么给它们奇怪的名字).但是,即使参数数量不同,Ruby似乎也只保留最后一个setVelocity.所以当我用3个参数调用setVelocity时会说我只需要用一个参数调用该方法.

ruby overloading

19
推荐指数
1
解决办法
2万
查看次数

公共运营商新的私人运营商删除:使用新的时候获取C2248"无法访问私人会员"

一个类重载了运算符newdelete.new是公开的,delete是私人的.

构造此类的实例时,我收到以下错误:

pFoo = new Foo(bar)
Run Code Online (Sandbox Code Playgroud)

example.cpp(1):错误C2248:'Foo:operator delete':无法访问类'Foo'中声明的私有成员

但是这里没有调用delete,所以在编译器的扭曲思想中发生了什么?:)

  1. 错误的原因是什么?
  2. 是否有可能在不诉诸成员CreateInstance函数的情况下解决问题?

c++ overloading compiler-errors

19
推荐指数
1
解决办法
2655
查看次数

覆盖纯虚函数的参数数量

我已经实现了以下界面:

template <typename T>
class Variable
{
public:
  Variable (T v) : m_value (v) {}
  virtual void Callback () = 0;
private:
  T m_value;
};
Run Code Online (Sandbox Code Playgroud)

一个适当的派生类将定义如下:

class Derived : public Variable<int>
{
public:
  Derived (int v) : Variable<int> (v) {}
  void Callback () {}
};
Run Code Online (Sandbox Code Playgroud)

但是,我想派生Callback接受不同参数的类(例如:void Callback (int a, int b)).有没有办法做到这一点?

c++ virtual overloading interface

19
推荐指数
2
解决办法
3万
查看次数

在Java 7中使用方法重载时,为什么autoboxing不会覆盖varargs?

我们的Java项目中有一个类LogManager,如下所示:

public class LogManager {

    public void log(Level logLevel, Object... args) {
        // do something
    }

    public void log(Level logLevel, int value, Object... args) {
        // do something else
    }
}
Run Code Online (Sandbox Code Playgroud)

在Debian下用OpenJDK 6编译项目时,每个工作都很好.使用OpenJDK 7时,构建(使用ant完成)会产生以下错误,并且构建失败:

[javac] /…/LogManager.java:123: error: reference to log is ambiguous,
                      both method log(Level,Object...) in LogManager
                      and method log(Level,int,Object...) in LogManager match
[javac]       log(logLevel, 1, logMessage);
[javac]       ^
[javac] /…/SomeOtherClass.java:123: error: reference to log is ambiguous,
                      both method log(Level,Object...) in LogManager
                      and method log(Level,int,Object...) in …
Run Code Online (Sandbox Code Playgroud)

java compiler-construction autoboxing overloading variadic-functions

19
推荐指数
1
解决办法
2471
查看次数

重载方法在Resharper中给出"带有可选参数的方法被重载隐藏"警告

我有几个C#应用程序进行日志记录,并且Output方法有一个重载来接受消息和StreamWriter,另一个重载有一个params数组的附加参数.方法签名的一个示例是:

private static void Output(string message, StreamWriter writer, params object[] args) 
{..}

private static void Output(string message, StreamWriter writer) 
{..}
Run Code Online (Sandbox Code Playgroud)

问题涉及Resharper对这些方法给出以下警告:" 带有可选参数的方法被重载隐藏 ".

该警告具有误导性,因为我从3个param重载内部调用2-param重载并且它不会导致递归调用,因此不会隐藏重载.

我对Resharper网站做了一些研究,并且在这个问题上已经打开了一些已经关闭的门票,因为"无法修复".

在我看来,这是一个有效的用例,因为运行时知道调用哪个重载..NET框架中也有一些示例,它们使用这种重载.

例如,StreamWriter.WriteLine()要写入值的重载,以及Format params.

这是一个有效的参数,还是应该将我的方法重命名为类似"OutputFormat"的东西,因为它们在幕后使用string.Format来构建一个带有指定参数的字符串?

.net resharper string.format overloading resharper-7.1

19
推荐指数
1
解决办法
6961
查看次数

如何在打字稿中为 const 定义重载签名?

我们可以在打字稿中定义这样的重载函数:

function hello(name: number): void;
function hello(name: string): void;
function hello(name: number | string): void {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

我尝试将此函数定义为 const,例如:

const hello = (name: number | string): void => {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

但不确定如何在其上声明重载签名:

(name: number): void; 
(name: string): void;
Run Code Online (Sandbox Code Playgroud)

请帮忙,谢谢

overloading typing typescript

19
推荐指数
2
解决办法
7278
查看次数

如何获取重载成员函数的地址?

我正在尝试获取指向特定版本的重载成员函数的指针.这是一个例子:

class C
{
  bool f(int) { ... }
  bool f(double) { ... }

  bool example()
  {
    // I want to get the "double" version.
    typedef bool (C::*MemberFunctionType)(double);
    MemberFunctionType pointer = &C::f;   // <- Visual C++ complains
  }
};
Run Code Online (Sandbox Code Playgroud)

错误消息是"错误C2440:'初始化':无法从'重载函数'转换为'MemberFunctionType'"

如果f没有重载,这可以工作,但不是在上面的例子中.有什么建议吗?

编辑

请注意,上面的代码并没有反映我的现实世界问题,那就是我忘记了一个"const" - 这就是被接受的答案所指出的.不过,我会留下问题,因为我觉得问题可能发生在其他人身上.

c++ overloading pointer-to-member

18
推荐指数
1
解决办法
1万
查看次数

当两个重载具有相同的签名时,调用构造函数重载

考虑以下课程,

class Foo
{
    public Foo(int count)
    {
        /* .. */
    }

    public Foo(int count)
    {
        /* .. */
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码无效,不会编译.现在考虑以下代码,

class Foo<T>
{
    public Foo(int count)
    {
        /* .. */
    }

    public Foo(T t)
    {
        /* .. */
    }
}

static void Main(string[] args)
{
    Foo<int> foo = new Foo<int>(1);
}
Run Code Online (Sandbox Code Playgroud)

以上代码有效且编译良好.它调用Foo(int count).

我的问题是,如果第一个无效,第二个如何有效?我知道类Foo <T>是有效的,因为T和int是不同的类型.但是当它像Foo <int> foo = new Foo <int>(1)一样使用时,T会得到整数类型,并且两个构造函数都具有相同的签名吗?为什么编译器不显示错误而不是选择执行重载?

c# compiler-construction constructor overloading

18
推荐指数
3
解决办法
3593
查看次数

继承和方法重载

为什么C++编译器会出现此错误?为什么我可以从B访问lol(),但无法访问rofl()[不带参数].捕获量在哪里?

class A
{
public:
   void lol(void) {}
   void rofl(void) { return rofl(0);}
   virtual void rofl(int x) {}
};

class B : public A
{
public:
   virtual void rofl(int x) {}
};

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
   a.lol();
   a.rofl(1);
   a.rofl();

   B  b;
   b.lol();
   b.rofl(1);    
   b.rofl(); //ERROR -> B::rofl function does not take 0 arguments


   return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ inheritance overriding overloading

18
推荐指数
1
解决办法
9624
查看次数