C++CRTP名称查找

C++ CRTP Name Lookup

本文关键字:查找 C++CRTP      更新时间:2023-10-16

为什么此代码编译失败(未声明的标识符'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可以解决问题。

它不编译,因为在名称查找过程中会忽略依赖基类,而base是依赖基类。

您可以使用this指针:

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

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

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

注意:

  • 请参阅C++常见问题解答中的相关条目

由于有时您可能希望使用>>作为二进制运算符(右移),因此它不会在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;
}