MSVS别名错误C2988(C ++)

时间:2018-01-17 09:40:42

标签: c++

我在尝试编译此代码时在MS VS2017中收到错误C2988:

template<typename T>
using Iterator<T> = typename T::iterator;

这是B. Stroustrup书&#34; C ++编程语言,第4版&#34;的一个例子。不幸的是VS拒绝这个代码。我已经读到这可能是微软编译器的某种错误,但主题是从2013年开始,我无法相信他们还没有修复它。这是令人沮丧的,因为我试图理解C ++中的别名,我不知道问题是出在我身边还是编译器方面。任何帮助都会很好。

编辑: 谢谢你快速回答。我已按照您的建议更改了模板并且有效:

template<typename T>
using Iterator = typename T::iterator;

template <typename C, typename V>
std::vector<Iterator<C>> find_all(C & c, V v)
{
    std::vector<Iterator<C>> res;
    for (auto p = c.begin(); p != c.end(); ++p)
        if (*p == v)
            res.push_back(p);
    return res;
}

测试功能:

void find_all_test()
{
    std::string m{ "Marry had a little lamb" };
    for (auto p : find_all(m, 'a'))
        if (*p != 'a')
            std::cerr << "Error!\n";
}

你知道为什么Stroustrup的书中会出现这样的错误吗?这个翻译是错误的(我使用波兰语翻译因为它比原版便宜得多),或者是否有任何拥有该书原始版本的人检查它是否出现在那里(这是第4.5.1章)。我浪费了一个小时的学习时间来弄清楚我做错了什么。谢谢你解决了我的问题。

1 个答案:

答案 0 :(得分:1)

语法与其他模板相同,但你的看起来有点像部分特化(对于类型别名不存在),因此编译器会产生混淆:

template<typename T>
using Iterator    = typename T::iterator;
//            ^^^ No <T> please!