У меня есть этот пример кода:Ошибка передачи аргументов функции шаблона с константным спецификатором
#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 'не работает, когда аргумент имеет определитель констант. Почему это происходит?
Это ошибка компиляции:
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
Сообщите, пожалуйста, точную ошибку. –
Clang, OTOH, сообщает об [замещении замены] (http://coliru.stacked-crooked.com/a/4f3b5cf491634c3e). – jrok
Игнорируя причину, вы можете поместить 'const' для решения проблемы:' void func2 (const T & value) '. – deepmax