Здравствуйте! Подскажите, пожалуйста:
Почему такой код компилируется в MSVC 2012 без ошибок, несмотря на использование typename :
#include "stdafx.h" // нужно для MSVC
#include <iostream>
using namespace std;
template <class T>
struct A
{
void g()
{
int x = 5;
{
// если T::iterator - шаблон, принимающий числовой аргумент,
// это инстанциация шаблона в переменную x, перекрывающую x
// за фигурными скобками
// если T::iterator -- экземпляр класса с перегруженным оператором <,
// это сравнение T::iterator с нулём, а затем сравнение результата
// со значением переменной x!
typename T::iterator<0> x; //ВОТ ЭТА СТРОКА
}
}
};
struct T3
{
template<int C> struct iterator
{
iterator() { cout << "constructing template with C = " << C << endl; }
};
};
struct T4
{
struct Titerator
{
Titerator operator < (int value)
{
cout << "in operator < " << value << endl;
return Titerator();
}
bool operator > (int value)
{
cout << "in operator > " << value << endl;
return false;
}
};
static Titerator iterator;
};
T4::Titerator T4::iterator = T4::Titerator();
int main(int argc, char* argv[])
{
A<T3> a3; a3.g();
A<T4> a4; a4.g();
return 0;
}
Выдает следующий результат:
constructing template with C = 0
in operator < 0
in operator > 5