0

Здравствуйте! Подскажите, пожалуйста:

Почему такой код компилируется в 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

1 ответ 1

1

О, знакомый код :) Дело в том, что MSVC не вполне корректно реализует стандарт для обратной совместимости со старым кодом, а также, насколько я понимаю, для нужд собственных библиотек (SDK), и компилирует этот код даже в ANSI-режиме (/Za /Wall). GCC, например, этот код не компилирует.

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.