模板成员函数导致的错误C2275。这段代码错了吗?

时间:2010-09-21 20:46:03

标签: c++ visual-c++ templates member-functions

我想我已经遇到了一个(可能的)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的另一个合规问题吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

但是,一般情况下,只要TU包含template关键字,VC6就会非常蹩脚并且经常会窒息。几年来我不得不反对它(用几个编译器/编译器编译的大代码库; VC6给我们带来了无穷无尽的麻烦)并且在2003年摆脱它时非常高兴。

答案 1 :(得分:1)

这可能是VC6问题。虽然VC6正确编译了大多数基本模板,但是当您开始转向更高级的模板使用时,已知有许多问题。成员模板是已知VC6在一致性方面较弱的领域。

答案 2 :(得分:1)

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