1

我想我遇到了(可能的)VC6(我知道。这是我们使用的。)编译器错误,但我对我刚刚错过了一些愚蠢的事实持开放态度。给定以下代码(这只是一个示例!):

#include <iostream>

// Class with template member function:
class SomeClass
{
public:
  SomeClass() {};

  template<class T>
  T getItem()
  {
    return T();
  };
};


// Dummy just used to recreate compiler error
class OtherClass
{
public:
  OtherClass() {};
};

std::ostream& operator<<( std::ostream& oStr, const OtherClass& obj )
{
  return oStr << "OtherClass!";
};

// Main illustrates the error:
int main(int argc, char* argv[])
{
  SomeClass a;

  OtherClass inst2 = a.getItem<OtherClass>(); // Error C2275 happens here!
  std::cout << inst2 << std::endl;

  return 0;
}

如果我尝试编译此代码 VC6,则会在a.getItem<OtherClass>()产生时死掉:

Error C2275: 'OtherClass' : illegal use of this type as an expression.

我是否忽略了一些琐碎的语法问题?我违反规则了吗?这段代码在 gcc 4.3.4 下编译得很好。这是 VC6 的另一个合规性问题吗?

谢谢!

4

3 回答 3

2

在其中包含这个词的许多其他事情template中,VC6 无法处理模板参数不是函数参数的函数模板。常见的解决方法是添加一个虚拟函数参数:

  template<class T>
  T getItem(T* /*dummy*/ = NULL)
  {
    return T();
  } // note: no ; after function definitions

然而,一般来说,VC6 是相当蹩脚的,并且一旦 TU 包含template关键字就经常窒息。几年来我不得不与它搏斗(用几个编译器/编译器版本编译的大型代码库;VC6 给我们带来了无穷无尽的麻烦),当我在 2003 年摆脱它时非常高兴。

于 2010-09-21T22:27:29.840 回答
1

这很可能是 VC6 的问题。尽管 VC6 可以正确编译大多数基本模板,但众所周知,当您开始使用更高级的模板时会遇到很多问题。成员模板是已知 VC6 在一致性方面较弱的领域。

于 2010-09-21T20:52:29.373 回答
1

我相信这是 VC6 中的另一个错误,您应该真正切换到更新的编译器。

于 2010-09-21T20:52:29.927 回答