小编Shi*_*rik的帖子

C#通用运算符

我试图像这样实现一个泛型运算符:

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.我希望用泛型运算符+来解决这个问题,但是我只是得到了上面的语法错误(在<)让我相信这样的代码是不合法的.

有没有办法制作通用运营商?

c# generics operator-overloading

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

通过支配地位继承 - 这真的很糟糕吗?

我是其中一个必须使用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来关闭这个警告,但这不是我在这里问的问题.我是否应该在这里听编译器,或者这只是一个非常过分热心的警告?

c++ visual-c++ diamond-problem

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

切换无案例

今天,我偶然发现我的编译器在没有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,我已经在几个编译器上对它进行了测试,它们都产生了相同的行为.令人惊讶的是,它们都没有输出警告.)

c++ language-design switch-statement

13
推荐指数
1
解决办法
3259
查看次数

何时使用精心设计的类型说明符

是否有特别好的理由选择使用精心设计的类型说明符?例如,在某些情况下,需要使用templatetypename关键字来消除依赖关系template或类型的歧义.

但我想不出任何例子,如枚举这样的事情.请使用以下代码示例:

enum Foo { A,  B };

void bar(Foo foo);
void baz(enum Foo foo);
Run Code Online (Sandbox Code Playgroud)

为什么我可以选择使用baz()提供的语法bar()(反之亦然)?有什么含糊不清的案子吗?

c++ coding-style

8
推荐指数
1
解决办法
3530
查看次数

是不是在实例化时编译的模板类成员函数?

将代码从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是对的,为什么?

c++ gcc visual-studio

5
推荐指数
2
解决办法
334
查看次数

Apple还支持Java 6吗?

前段时间我用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.

java macos java-6

3
推荐指数
1
解决办法
540
查看次数