我想我已经遇到了一个(可能的)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的另一个合规问题吗?
谢谢!的
答案 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中的另一个错误,你应该真正切换到更新的编译器。