为什么编译器在范围中看不到变量?
问题描述:
操作系统:Windows 8.1为什么编译器在范围中看不到变量?
编译器:GNU C++
我有两个模板类:基类和派生。在基类中,我声明变量value
。当我尝试从派生类的方法申请到value
时,编译器向我报告错误。 但是,如果我不使用模板,我不会收到错误消息。
有错误消息:
main.cpp: In member function 'void Second<T>::setValue(const T&)':
main.cpp:17:3: error: 'value' was not declared in this scope
value = val;
^
有代码:
#include <iostream>
using namespace std;
template<class T>
class First {
public:
T value;
First() {}
};
template<class T>
class Second : public First<T> {
public:
Second() {}
void setValue(const T& val) {
value = val;
}
};
int main() {
Second<int> x;
x.setValue(10);
cout << x.value << endl;
return 0;
}
此代码的工作:
#include <iostream>
using namespace std;
class First {
public:
int value;
First() {}
};
class Second : public First {
public:
Second() {}
void setValue(const int& val) {
value = val;
}
};
int main() {
Second x;
x.setValue(10);
cout << x.value << endl;
return 0;
}
答
因为基类是相关的,也就是说,取决于您的模板参数T.在这些情况下,非限定名称查找不考虑基类的范围。所以你必须限定名称,例如,这个。
this->value = val;
请注意,MSVC是不这个规则兼容,并会解析名称,即使它是不合格的。
+3
流氓生活MSVC ... – UmNyobe
不合格查找不查看依赖基类。必须有一个巨大的复制品在那里... –
适用于VS2015。当您将'value = val;'更改为'First :: value = val;'时,它也可以工作。 (http://coliru.stacked-crooked.com/a/3f6103bc3ae99c8f) –
@SimonKraemer:在这种情况下,MSVC不符合要求。 –