basic_string的C ++模板推导失败

时间:2013-12-04 14:54:24

标签: c++ templates c++11 stdstring

我在模板上苦苦挣扎;我正在尝试编写一个迭代一系列字符串的方法,无论它们的类型或它们保存在哪个容器中。在下面的代码中:

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 ++模板的初学者。

1 个答案:

答案 0 :(得分:4)

简单来说,模板参数类型推导仅适用于最后::的权限,如果有的话。想象一下你告诉编译器的内容:

我正在使用某种类型调用foo()。现在,我希望您查看可能存在的所有单参数类模板,尝试使用所有可能的类型实例化每个模板,并查看嵌套typedef iterator中的哪一个匹配我发送给{的类型{1}}。然后使用该组合作为模板参数。

我相信这显然不起作用。这就是为什么foo左边的任何内容都是非推导的上下文,因此这种上下文中的模板参数不参与模板参数推导。由于::没有提供其他背景,因此无法推断出论证。