c++ - 由模板成员函数引起的错误 C2275。这段代码有错吗?

标签 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 的另一个合规性问题吗?

谢谢!

最佳答案

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

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

但是,一般来说,VC6 非常蹩脚,并且经常在 TU 包含 template 关键字时立即卡住。我不得不为此苦苦挣扎了好几年(用多个编译器/编译器版本编译的大型代码库;VC6 给我们带来了无穷无尽的麻烦),当我在 2003 年摆脱它时感到非常高兴。

关于c++ - 由模板成员函数引起的错误 C2275。这段代码有错吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3764340/

相关文章:

c++ - 引用指针问题

c++ - 如何正确使用wstrings?

c++ - 如何迭代 CString 并将其字符与 int 进行比较?

c++ - 有没有办法在 occi 中预取 LOB 数据?

c++ - nodejs的内存分布

c++ - boost 安装 : missing argument global-setup

javascript - 如何将自定义模板与 Angucomplete-alt 一起使用?

c++ - 获取类中的字段数

c++ - 将不同的模板类存储在同一个容器中

c++ - 传递右值与左值 vector