Ошибка передачи аргументов в шаблонную функцию с квалификатором const

У меня есть этот пример кода:

#include <iostream>
#include <memory>

template <typename T>
void func1(T& value)
{
std::cout << "passed 1 ..." << std::endl;
}

template <template <typename> class T, typename U>
void func2(T<U>& value)
{
std::cout << "passed 2 ..." << std::endl;
}

int main()
{
std::auto_ptr<int> a;
const std::auto_ptr<int> ca;

// case 1: using func1
func1(a);  // OK
func1(ca); // OK

// case 2: using func2
func2(a);  // OK
func2(ca); // Compilation error

return 0;
}

В первом случае функция ‘func1’ принимает общий аргумент независимо от квалификатора, однако во втором случае функция ‘func2’ завершается ошибкой, когда аргумент имеет квалификатор const. Почему это происходит?

Это ошибка компиляции:

make all
Building file: ../src/Test2.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Test2.d" -MT"src/Test2.d" -o "src/Test2.o" "../src/Test2.cpp"../src/Test2.cpp: In function ‘int main()’:
../src/Test2.cpp:27: error: invalid initialization of reference of type ‘std::auto_ptr<int>&’ from expression of type ‘const std::auto_ptr<int>’
../src/Test2.cpp:11: error: in passing argument 1 of ‘void func2(T<U>&) [with T = std::auto_ptr, U = int]’
make: *** [src/Test2.o] Error 1

2

Решение

Проблема в том, что в случае func1, компилятор должен выводить T и мы получаем

  • T является std::auto_ptr<int> в первом звонке
  • T является const std::auto_ptr<int> во втором звонке

В обоих случаях T действует само по себе.

Теперь для func2, компилятор должен выводить T а также U, где T это параметр шаблона шаблона Что было бы необходимо это:

  • T является std::auto_ptr, U является int в первом звонке
  • T является const std::auto_ptr, U является int во втором звонке

и есть ваша проблема: T не может быть const std::auto_ptr сам, так как он объединил свойство типа const с шаблоном std::auto_ptr который не является допустимым типом.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]