c++ - g++ 模板错误或 VC 过于宽松?

标签 c++ templates g++

我正在用 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/

相关文章:

c++ - C/C++ 编程中需要全局析构函数吗?

c++ - 当函数接受 T&& 的参数并传递左值时,模板参数 T 是否应该解析为 T&?

c++ - g++,基于范围和向量化

c++ - 是否可以在模板中定义指向外部 -"C"函数类型的指针?

linux - -O2 优化会破坏某些机器上的 C++ 代码

c++ - 使用线程的矩阵乘法

c++ - 在 C++ 中复制数组的最快可移植方法是什么

c++ - 使用运算符重载打印链表

c++ - Arduino 内联 ASM 未按预期工作

c++ - 尝试(稍微)概括 C++ 模板。关联容器 key :Value Inversion