我在C++中编写了一个模板化很强的代码。它在VS 2005中完美运行,但是当我尝试在g ++中编译它时,出现了一些非常奇怪的错误。g ++模板bug或VC太自由了?
的代码的基本块(简化到最少,不编译要么)如下:
template <class Actual>
class Generic
{
public:
typedef Actual ThisType;
};
template <class Actual>
class Intermediate : public Generic<Actual>
{
};
template <class Q>
class Derived : public Intermediate<Derived<Q> >
{
public:
void FooBar()
{
ThisType q;
}
};
错误是: 在“‘ThisType’未在此范围内声明” 'q'正在被宣布的行。
奇怪的是,当Derived不是模板而是普通类时,一切正常。为什么编译器甚至在实例化之前会查看模板函数实现?我知道VC++在编译模板时检查得太少(未使用的模板甚至可能包含语法错误的代码) - 但是g ++在这里检查的太多了吗?我尝试添加一个没有希望的typename关键字,它也失败了。有没有什么办法让ThisType按预期工作?我害怕将它手动添加到每个派生类的想法 - 这是繁琐,冗余,不雅和错误诱导。
最好的问候, MZ
我觉得有趣的是,'return * this;'不会引发任何编译错误,因为函数是void。 – karlphillip 2011-03-16 23:10:02
如果你问这个问题,答案几乎总是“VC太自由了”。 – EboMike 2011-03-16 23:11:35
我承认,当我看着这段代码时,我的大脑也得到了解析错误 – hirschhornsalz 2011-03-16 23:16:26