Общее программирование немного отличается от объектно-ориентированного программирования.
Ваш mTuple
является примером независимого имени . Что касается компилятора, то во время обработки определения шаблона компилятор не знает, что шаблон класса унаследовал член данных с именем mTuple
. Это может быть очевидно для вас, но это не очевидно для компилятора. На этом этапе компилятор не замечает очевидного.
Если методы шаблона производного класса хотят использовать некоторый член шаблона родительского класса, компилятору необходимо явно указать это сделать. Отсюда using
.
Редактировать
Выше было немного кратко. Важно помнить, что эти шаблоны классов не являются классами. Это шаблоны, которые в конечном итоге определяют класс. Вплоть до того момента, когда шаблон класса используется для определения класса, этот шаблон класса не вполне реален. Что еще более важно, для шаблона класса, который наследуется от какого-либо другого шаблона класса, это наследование не вполне реально. Компилятор не знает об этом наследовании, если об этом явно не сказано. Вот почему вы увидите, что шаблоны производных классов импортируют членов родительского класса через using ParentClass<Type>::member
(например).
Редактировать # 2
Маршалл Клайн обсуждает эту тему в своем C ++ - FAQ по http://www.parashift.com/c++-faq-lite/templates.html#faq-35.19
Редактировать # 3
(По запросу) Тот факт, что некоторый код компилируется на вашем компиляторе, не означает, что он компилируется на каждом компиляторе (для того же языка). Поставщики компиляторов добавляют свои собственные «особенности» к языку, иногда очень намеренно, иногда просто потому, что сами поставщики обманывают, а иногда потому, что сам стандарт содержит ошибки. Эта проблема не совсем стандартных компиляторов долгое время была проблемой со многими языками. Проблема, очевидно, довольно широко распространена, когда дело доходит до общего программирования.
Вы можете делать все правильно (или так, как вы думаете): включите все стандартные предупреждения, а затем некоторые, запустите свой код через какой-то коммерческий анализатор кода, и у вас все еще может не быть переносимого кода.