ошибка C2440: «инициализация»: невозможно преобразовать из «const temp1» в «temp2»

c++ templates

472 просмотра

2 ответа

Может ли кто-нибудь сообщить мне причину, по которой компилятору не нравится мой код ниже?

Я использую VS2010. Я не могу использовать C ++ 11 или выше. У меня есть определение функции шаблона в заголовочном файле, и я вызываю эту функцию из другого файла cpp.

header.h

typedef struct temp1
{
  int x;
  double d;
}
temp1;

typedef struct temp2
{
  double d;
  int x;
}
temp2;

class A
{
  public:
    A();
    ~A();

  public:   
    template<typename T1> void foo(const T1& xx, int x)
    {
      if( 1 == x )
      {         
        temp1 t1 = xx;
        //  Do some operation
      }

      if (2 == x )
      {
        temp2 t2 = xx;
        // Do some operation        
      }
    }                                      
  };

Source.cpp

  int _tmain(int argc, _TCHAR* argv[])
  {
    A temp;

    temp1 t1;
    t1.x = 10;
    t1.d = 10.10;   

    temp2 t2;
    t2.x = 20;
    t2.d = 20.20;

    temp.foo(t1,1);
    temp.foo(t2,2);

    return 0;
  }

Ошибка, сообщенная компилятором:

Error   1   error C2440: 'initializing' : cannot convert from 'const temp1' to 'temp2'
Error   2   error C2440: 'initializing' : cannot convert from 'const temp2' to 'temp1'
Автор: Praveer Kumar Источник Размещён: 08.11.2019 11:20

Ответы (2)


1 плюс

Шаблоны являются чистой конструкцией времени компиляции . Это означает, что весь код должен быть правильным при его сборке.

Так как вы хотите делать выбор во время выполнения в зависимости от переданных аргументов, он не будет работать.

Простое решение состоит в том, чтобы иметь две перегрузки функции вместо одной шаблонной функции: одну функцию, которая принимает в temp1качестве аргумента, и другую, которая принимает temp2.


На несвязанном примечании вам не нужны typedefструктуры в C ++. Имя структуры - это имя типа, как и классы. Классы и структуры почти одинаковы в C ++, единственное отличие заключается в видимости по умолчанию ( publicдля структур и privateдля классов).

Автор: Some programmer dude Размещён: 20.08.2016 01:17

1 плюс

Компилятор должен сгенерировать допустимый код для функций вашего шаблона для всех возможных значений параметров. Поэтому, когда вы делаете вызов, temp.foo(t1,1);он создает экземпляр для функции шаблона, в которой он может назначить t1 для temp2, чего он не может. Если if, в котором это происходит, не выполняется, потому что x == 1 не имеет отношения к компилятору, потому что он генерирует экземпляр, который также может быть вызван с другими значениями для x.

Автор: Eelke Размещён: 20.08.2016 01:17
Вопросы из категории :
32x32