在C#中,我需要能够定义一个方法,但让它返回一个或两个返回类型.我尝试这样做时编译器给出了一个错误,但为什么不知道我需要调用哪种方法呢?
int x = FunctionReturnsIntOrString();
Run Code Online (Sandbox Code Playgroud)
为什么编译器会阻止我使用具有不同返回类型的两个函数?
我有这个代码:
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时会说我只需要用一个参数调用该方法.
一个类重载了运算符new和delete.new是公开的,delete是私人的.
构造此类的实例时,我收到以下错误:
pFoo = new Foo(bar)
Run Code Online (Sandbox Code Playgroud)
example.cpp(1):错误C2248:'Foo:operator delete':无法访问类'Foo'中声明的私有成员
但是这里没有调用delete,所以在编译器的扭曲思想中发生了什么?:)
CreateInstance函数的情况下解决问题?我已经实现了以下界面:
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)).有没有办法做到这一点?
我们的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
我有几个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来构建一个带有指定参数的字符串?
我们可以在打字稿中定义这样的重载函数:
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)
请帮忙,谢谢
我正在尝试获取指向特定版本的重载成员函数的指针.这是一个例子:
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" - 这就是被接受的答案所指出的.不过,我会留下问题,因为我觉得问题可能发生在其他人身上.
考虑以下课程,
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++编译器会出现此错误?为什么我可以从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) overloading ×10
c++ ×4
c# ×2
.net ×1
autoboxing ×1
constructor ×1
inheritance ×1
interface ×1
java ×1
overriding ×1
resharper ×1
ruby ×1
typescript ×1
typing ×1
virtual ×1