为什么这段代码无法编译(未声明的标识符'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
可以解决问题。
答案 0 :(得分:6)
它没有编译,因为在名称查找期间忽略了依赖的基类,base
是依赖基础。
您可以使用this
指针:
end() {
this->x = 5;
}
或者只是明确地命名基类:
end() {
base::x = 5;
}
注意:强>
答案 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;
}