C ++ CRTP名称查找

时间:2014-10-26 06:25:13

标签: c++ templates crtp

为什么这段代码无法编译(未声明的标识符'x',g ++ 4.9和clang ++ 3.5)?

template <class T>
struct base {
    int x;
};

template <class U>
struct end : public base<U> {
    end() {
        x = 5;
    }
};

注意:明确指定this->x可以解决问题。

2 个答案:

答案 0 :(得分:6)

它没有编译,因为在名称查找期间忽略了依赖的基类,base是依赖基础。

您可以使用this指针:

end() {
    this->x = 5;
}

或者只是明确地命名基类:

end() {
    base::x = 5;
}

注意:

  • 请参阅C++ FAQ
  • 中的相关条目

答案 1 :(得分:0)

因为有时你可能想要使用>>作为二元运算符(右移),所以这不能在gcc和clang中编译(它用MSVC 13编译)。

轻松修复是添加>>> >的空格:

 class end : public middle<end<U> >

这有效:

#include <iostream>

using namespace std;

class base {
public:
    int x;
};

template <class T>
class middle : public base {};

template <class U>
class end : public middle<end<U> > {
    public:
        end() {
        base::x = 5;
    }
};

int main()
{
    end<middle<base> > e;
    cout << e.x << endl; 

    return 0;
}