我正在用 C++ 编写一段高度模板化的代码。它在 VS 2005 中运行良好,但是当我尝试在 g++ 中编译它时,我遇到了一些非常奇怪的错误。
基本代码(简化到最低限度,也不编译)如下:
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 按预期工作?我害怕将它手动添加到每个派生类中的想法 - 它很麻烦、多余、不优雅并且会引发错误。
最好的问候, 梅兹
最佳答案
不在依赖基类中查找非限定名称(您的基类取决于模板参数 Q
)。限定该名称,它将起作用。
typename Derived::ThisType q;
关于c++ - g++ 模板错误或 VC 过于宽松?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5332908/