2016-02-15 45 views
3

操作系统: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; 
} 
+2

不合格查找不查看依赖基类。必须有一个巨大的复制品在那里... –

+0

适用于VS2015。当您将'value = val;'更改为'First :: value = val;'时,它也可以工作。 (http://coliru.stacked-crooked.com/a/3f6103bc3ae99c8f) –

+0

@SimonKraemer:在这种情况下,MSVC不符合要求。 –

回答

6

因为基类是相关的,也就是说,取决于您的模板参数T.在这些情况下,非限定名称查找不考虑基类的范围。所以你必须限定名称,例如,这个。

this->value = val; 

请注意,MSVC是这个规则兼容,并会解析名称,即使它是不合格的。

+3

流氓生活MSVC ... – UmNyobe

相关问题