визуальная студия intellisense ошибка - PullRequest
1 голос
/ 13 ноября 2009
template <typename T>
class Test {
        friend Test<T> & operator * (T lhs, const Test<T> & rhs) {
            Test<T> r(rhs);
//              return r *= lhs;
        }
}

4 IntelliSense: идентификатор "T" не определен

Почему T определяется в строке 3, а не в строке 4? Я имею в виду, я думаю, что это не настоящая ошибка, а просто ошибка intellisense ... Она все равно работает, но что-то не так? Могу ли я это исправить? Или как-нибудь убрать красные загогулины?

Я использую Visual Studio 2010. Интересно, происходит ли это и в других версиях?

Ответы [ 2 ]

1 голос
/ 09 апреля 2010

Кажется, что это путается из-за определения внутри класса. Итак, изменив код на:

template <typename T>
class Test {

    friend Test<T> & operator * (T lhs, const Test<T> & rhs);
};

template <typename T>
Test<T> & operator * (T lhs, const Test<T> & rhs) {
    Test<T> r(rhs);
}

устраняет проблему.

Это похоже на ошибку в компиляторе, ваш код должен быть легальным, основываясь на моем прочтении спецификации (в частности, 11.4 / 5).

1 голос
/ 13 ноября 2009

Intellisense показывает T как неопределенное, потому что это универсальный тип шаблона. В зависимости от того, как вы создаете экземпляр класса, T будет другого типа. Например, если у вас есть Test<int> A, T имеет тип int, но если вы вызываете Test<string> A, T имеет тип string для этого класса и его методов.

...