我试图像这样实现一个泛型运算符:
class Foo
{
public static T operator +<T>(T a, T b)
{
// Do something with a and b that makes sense for operator + here
}
}
Run Code Online (Sandbox Code Playgroud)
我真正要做的就是优雅地处理继承.使用Foo中的标准运算符+,其中T代替"Foo",如果有人来自Foo(比如Bar继承Foo),那么Bar + Bar操作仍将返回Foo.我希望用泛型运算符+来解决这个问题,但是我只是得到了上面的语法错误(在<)让我相信这样的代码是不合法的.
有没有办法制作通用运营商?
我是其中一个必须使用0警告编译代码的人之一.通常我尊重编译器,如果它发出警告,我会把它作为一个标志,我应该稍微修改我的代码.如果我必须告诉编译器忽略给定的警告,我会抽搐一下.
但是这个我似乎无法绕过,从我可以告诉我没有做任何"坏事".有人认为这是一个糟糕的设计吗?我看不出任何特别讨厌的东西(除了"邪恶的钻石"),但它是完全有效和有用的代码.但它会产生(在MSVC中)2级警告!
class IFoo
{
public:
virtual void foo() = 0;
};
class Bar : public virtual IFoo
{
public:
virtual void foo() { std::cout << "Hello, world!"; }
};
class Baz : public virtual IFoo
{
};
class Quux : public Bar, public Baz
{
};
Run Code Online (Sandbox Code Playgroud)
现在,如果我创建一个Quux对象,应该期望调用Bar :: foo实现.MSVC非常有帮助:它警告我不够模棱两可?
警告C4250:'Quux':通过优势继承'Bar :: Bar :: foo'
现在我知道我可以用一个pragma来关闭这个警告,但这不是我在这里问的问题.我是否应该在这里听编译器,或者这只是一个非常过分热心的警告?
今天,我偶然发现我的编译器在没有case的情况下在switch语句中编写代码时不会抱怨.(它确实抱怨缺少案例陈述,但在代码之后添加一个,没有多少警告让我知道代码是没用的.)
我试图弄清楚是否有允许以下代码的目的,或者它只是其中一个"限制它的更多工作,所以它是允许的".
#include <iostream>
void foo() {
std::cout << "foo" << std::endl;
}
int main()
{
for (int a = -10; a < 10; ++a)
{
switch(a)
{
foo();
case 4:
std::cout << "4" << std::endl;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当a == 4时,这会按预期输出"4",并且它永远不会输出foo.所以问题是,是否有一些(可能是深奥但有用的)理由允许foo();
在第一个案例之前发表声明?我知道我不能在那里声明和初始化变量.
(FWIW,我已经在几个编译器上对它进行了测试,它们都产生了相同的行为.令人惊讶的是,它们都没有输出警告.)
是否有特别好的理由选择使用精心设计的类型说明符?例如,在某些情况下,需要使用template
或typename
关键字来消除依赖关系template
或类型的歧义.
但我想不出任何例子,如枚举这样的事情.请使用以下代码示例:
enum Foo { A, B };
void bar(Foo foo);
void baz(enum Foo foo);
Run Code Online (Sandbox Code Playgroud)
为什么我可以选择使用baz()
提供的语法bar()
(反之亦然)?有什么含糊不清的案子吗?
将代码从Visual Studio移植到gcc时,我发现了一个奇怪的问题.以下代码在Visual Studio中编译良好,但导致gcc中出错.
namespace Baz
{
template <class T>
class Foo
{
public:
void Bar()
{
Baz::Print();
}
};
void Print() { std::cout << "Hello, world!" << std::endl; }
}
int main()
{
Baz::Foo<int> foo;
foo.Bar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的理解是这应该编译好,因为在实例化模板之前不应该编译类(在定义了Print()之后).但是,gcc报告如下:
t.cpp:在成员函数'void Baz :: Foo :: Bar()'中:第8行:错误:'Print'不是'Baz'的成员
谁是对的?如果gcc是对的,为什么?
前段时间我用Java发布了一个应用程序.虽然我的目标是Java 6,但我意识到有一个重要的Macintosh用户群.当时,Apple还没有为其用户创建JRE 6,因此我必须使该应用程序与Java 5和6兼容.
现在我回到那个项目,意识到我不能再支持那些用户了; Sun不会再让我下载JDK 5了,因为它已经结束了.所以我陷入了十字路口; 据我所知,PPC Mac用户仍然没有使用JRE 6.
所以我问这个问题:我该如何解决这个困境?我仍然想支持这些用户,但我根本没有用于构建的JDK.Apple是否为其PPC用户发布了JRE 6?是否有另一种方法可以获得JDK 5(除了成为Sun的业务成员之外)?是否有一些替代建议来支持这些用户?
问候, - Shirik
编辑:一些额外的信息,如果苹果已经发布的Java 6的PPC,有多容易获得?我问这个是因为我仍然经常看到用户的日志,这些日志表明PPC架构带有Java 5 VM.