Лучшее, что я могу определить, - это то, что символы, определенные в родительском классе, больше не переносятся в дочерний класс по умолчанию.Это противоречит тому, как я всегда считал, что C ++ работает.
template<typename T>
class Parent
{
public:
typedef T* iterator;
};
template<typename T>
class Child : public Parent < T >
{
public:
//using iterator = Parent<T>::iterator; // this fixes error C3646 and error C2059
iterator begin(void)
{
return nullptr;
}
};
1>Test1.cpp(14,1): error C3646: 'begin': unknown override specifier
1>Test1.cpp(18): message : see reference to class template instantiation 'Child<T>' being compiled
1>Test1.cpp(14,16): error C2059: syntax error: '('
1>Test1.cpp(15,1): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
Это началось, когда я изменил настройки файла на C ++ 14 или C ++ 17, до этого это былоХОРОШО.Кажется, нет никакого способа восстановить предыдущее поведение, даже выбор «По умолчанию» генерирует ошибки.В Visual Studio 2013 он по-прежнему работает нормально.