gpt4 book ai didi

c++ - 使用 const 限定符将参数传递给模板函数时出错

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:26:12 30 4
gpt4 key购买 nike

我有这个代码示例:

#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

最佳答案

问题是在 func1 的情况下, 编译器需要推导 T我们得到

  • Tstd::auto_ptr<int>在第一次通话中
  • Tconst std::auto_ptr<int>在第二次通话中

在这两种情况下 T本身有效。

现在 func2 , 编译器需要推导 TU , 其中T是模板模板参数。需要的是:

  • Tstd::auto_ptr , Uint在第一次通话中
  • Tconst std::auto_ptr , Uint在第二次通话中

还有你的问题:T不能const std::auto_ptr本身,因为它结合了类型属性 const带模板std::auto_ptr这不是一个有效的类型。

关于c++ - 使用 const 限定符将参数传递给模板函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19036424/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com