所以我有一些简单的问题/结构:
class Class1 {
public:
Class1() {};
~Class1() {};
protected:
std::string name;
}
class Class2 : public Class1
{
public:
Class2() : number(id_generator++) {
name = "My-name"; // (1) want to access field inherited from Parent
};
private:
const unsigned int number;
static unsigned int id_generator;
}
编译器抱怨(1):'name' was not declared in this scope
。怎么了?它看起来很简单但我看不到它。
EDIT1:我刚才意识到错误实际上只是在这里发音(here链接到代码):
#include <string>
template<int dim>
class Class1 {
public:
Class1() {};
~Class1() {};
protected:
std::string name;
};
template<int dim>
class Class2 : public Class1<dim>
{
public:
Class2() : number(id_generator++) {
name = "My-name"; // (1) want to access field inherited from Parent
};
private:
const unsigned int number;
static unsigned int id_generator;
};
int main() {}
显然我用模板弄乱了一些东西。对不起,因为没有把它写在第一位。
答案 0 :(得分:2)
在模板中,对于引用从基类继承的成员的非限定名称,您应该通过解除引用this
来使用显式语法:
Class2() : number(id_generator++) {
this->name = "My-name"; // (1) want to access field inherited from Parent
// ^^^^^^
};
或者,或者,您可以通过这种方式限定名称:
Class2() : number(id_generator++) {
Class1<dim>::name = "My-name";
// ^^^^^^^^^^^^^
};
否则,编译器将在first phase of name lookup期间在全局命名空间中查找name
,如果未找到,则会发出错误。
答案 1 :(得分:0)
除了分号外,代码很好。
唯一可能的解释是编译器看到Class1
实际上没有name
成员。你有多个名为Class1
的班级吗?您是否拥有声明Class1
的头文件的多个副本?您是否有可能在运行编译器之前忘记保存文件?