我在模板上苦苦挣扎;我正在尝试编写一个迭代一系列字符串的方法,无论它们的类型或它们保存在哪个容器中。在下面的代码中:
template<template<class> class ContainerType,
typename CharType>
ContainerType<basic_string<CharType>>
foo(typename ContainerType<basic_string<CharType>>::iterator begin,
typename ContainerType<basic_string<CharType>>::iterator end,
CharType letter)
{
return ContainerType<basic_string<CharType>>();
}
int main()
{
vector<string> words;
auto bar = foo(words.begin(), words.end(), 'a');
}
编译器无法确定ContainerType
的类型。
我必须说我是C ++模板的初学者。
答案 0 :(得分:4)
简单来说,模板参数类型推导仅适用于最后::
的权限,如果有的话。想象一下你告诉编译器的内容:
我正在使用某种类型调用foo()
。现在,我希望您查看可能存在的所有单参数类模板,尝试使用所有可能的类型实例化每个模板,并查看嵌套typedef iterator
中的哪一个匹配我发送给{的类型{1}}。然后使用该组合作为模板参数。
我相信这显然不起作用。这就是为什么foo
左边的任何内容都是非推导的上下文,因此这种上下文中的模板参数不参与模板参数推导。由于::
没有提供其他背景,因此无法推断出论证。