Почему некоторые компиляторы настаивают на том, чтобы квалифицированные члены являлись открытыми членами базового класса шаблона, в то время как не требуется то же самое для не шаблонного класса? Пожалуйста, посмотрите на следующие списки кодов:
Шаблон класса:
#include <iostream>
using namespace std;
template <class T>
class TestImpl {
public: // It wont make a difference even if we use a protected access specifier here
size_t vval_;
TestImpl(size_t val = 0) : vval_(val) { }
};
template <class T>
class Test : public TestImpl<T> {
public:
Test(size_t val) : TestImpl<T>(val) {
cout << "vval_ : " << vval_ << endl; // Error: vval_ was not declared in this scope
//! cout << "vval_ : " << TestImpl<T>::vval_ << endl; // this works, obviously
}
};
int main() {
Test<int> test1(7);
return 0;
}
Не шаблонный класс:
#include <iostream>
using namespace std;
class TestImpl {
public: // It wont make a difference even if we use a protected access specifier here
TestImpl(size_t val = 0) : vval_(val) {}
size_t vval_;
};
class Test : public TestImpl {
public:
Test(size_t val) : TestImpl(val) {
cout << "vval_ : " << vval_ << endl;
}
};
int main() {
Test test1(7);
return 0;
}
Существенная разница между приведенными выше списками кода заключается в том, что, хотя первый список использует классы шаблонов, второй - нет.
Теперь оба списка прекрасно скомпилируются с Компилятор Microsoft Visual Studio (cl), но первый список WONT компилируется с обоими Digital Mars Compiler (dmc ) и Минималистский GNU для Windows (MinGW - g ++) компилятор. Я получу ошибку типа "vval_ не был объявлен в области видимости" - ошибка, я, очевидно, понимаю, что это значит.
Если я получу доступ к публичной переменной TestImpl vval_ с использованием TestImpl :: vval_ , код работает. Во втором листинге компиляторы не жалуются, когда производный класс обращается к переменной базового класса ' vval_ , не квалифицируя ее.
Что касается двух компиляторов и, возможно, других, мой вопрос заключается в том, почему я должен иметь возможность прямого доступа (без квалификации) к vval_ переменной напрямую из не шаблонного класса, унаследованного от не шаблонный класс , хотя я не могу сделать то же самое с шаблонным классом, унаследованным от шаблонного класса ?