Ошибка C2275, вызванная функцией-членом шаблона. Этот код неправильный? - PullRequest
1 голос
/ 22 сентября 2010

Я думаю, что я столкнулся с ( возможным ) VC6 ( Я знаю. Это то, что мы используем. ) ошибка компилятора, но я открыт для факта, что япросто пропустил что-то тупое.Учитывая следующий код ( Это просто пример! ):

#include <iostream>

// Class with template member function:
class SomeClass
{
public:
  SomeClass() {};

  template<class T>
  T getItem()
  {
    return T();
  };
};


// Dummy just used to recreate compiler error
class OtherClass
{
public:
  OtherClass() {};
};

std::ostream& operator<<( std::ostream& oStr, const OtherClass& obj )
{
  return oStr << "OtherClass!";
};

// Main illustrates the error:
int main(int argc, char* argv[])
{
  SomeClass a;

  OtherClass inst2 = a.getItem<OtherClass>(); // Error C2275 happens here!
  std::cout << inst2 << std::endl;

  return 0;
}

Если я попытаюсь скомпилировать этот код VC6, умрет на a.getItem<OtherClass>(), уступая:

Error C2275: 'OtherClass' : illegal use of this type as an expression.

Я пропустил какую-то тривиальную проблему синтаксиса?Я нарушаю правила?Этот код прекрасно компилируется под gcc 4.3.4.Это еще одна проблема соответствия с VC6?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 22 сентября 2010

Среди всего прочего со словом template в нем VC6 не может работать с шаблонами функций, где параметры шаблона не являются также параметрами функции.Обходным решением было добавить фиктивный параметр функции:

  template<class T>
  T getItem(T* /*dummy*/ = NULL)
  {
    return T();
  } // note: no ; after function definitions

Однако в целом VC6 довольно слабый и часто задыхается, как только TU содержит ключевое слово template.Мне приходилось биться с этим в течение нескольких лет (большая база кода скомпилирована с несколькими версиями компиляторов / компиляторов; VC6 доставлял нам бесконечное количество хлопот) и была очень рада, когда я избавилась от этого в 2003 году.

1 голос
/ 22 сентября 2010

Я считаю, что это еще одна ошибка в VC6, вам действительно следует перейти на более современный компилятор.

1 голос
/ 22 сентября 2010

Вероятно, это проблема VC6.Хотя VC6 правильно компилирует большинство базовых шаблонов, известно, что у вас много проблем, когда вы начинаете переходить к более сложным шаблонам.Шаблоны участников - это область, в которой VC6, как известно, слабо соответствует.

...