我正在阅读 C ++模板-完整指南,第二版,并从中获得了代码,如下所示:-
template<typename T>
void showVal(const T &arg1, const T &arg2)
{
std::cout << arg1 << arg2;
}
int main() {
showVal("hello", "world1");
return 0;
}
上面的代码给了我这个错误:-“错误C2782:'void showVal(const T&,const T&)':模板参数'T'不明确” 。这是合理的,因为我传递的参数被推导为const char [6]和const char [7]。为了解决这个问题,我对函数进行了如下更改:-
template<typename T, std::size_t L1, std::size_t L2>
void showVal(const T (&arg1)[L1], const T(& arg2)[L2])
{
std::cout << arg1 << arg2;
}
PS:-我从书中获得了此修复程序
主要的困惑在于L1和L2的值。编译器如何知道它必须将6和7传递给模板参数L1和L2。数组类型有任何规则吗?
答案 0 :(得分:3)
PowerShell -Command "'yourstring' -replace 'your', 'my'"
的类型为"hello"
,如第一次尝试的错误消息所示。数组的长度为6。如您所见,数组的长度是数组类型的一部分。由于编译器必须知道类型,因此它也隐式知道长度。
就像模板类型参数const char[6]
根据传递给非模板参数T
和const char
的表达式的类型推导为arg1
一样(类型为arg2
和const char[6]
),因此模板非类型参数const char[7]
和L1
也从这些相同的参数类型推导出来。
答案 1 :(得分:1)
功能模板
template<typename T, std::size_t L1, std::size_t L2>
void showVal(const T (&arg1)[L1], const T(& arg2)[L2])
用于调用showVal(“ hello”,“ world1”)编译器将进行隐式实例化
showVal(const char (&arg1)[6], const T(& arg2)[7])
就是这样一种方法,可以防止数组衰减到指针,将引用绑定到数组类型,从而实现函数定义已知参数的数组大小。 因此,对于调用showVal(“ hello”,“ world1”),编译器推断出T为char,而参数类型分别为char大小为6和7的数组。