C++ MSVS别名错误C2988(C+;+;)

C++ MSVS别名错误C2988(C+;+;),c++,C++,在尝试编译此代码时,MS VS2017中出现错误C2988: template<typename T> using Iterator<T> = typename T::iterator; 模板 使用Iterator=typename T::Iterator; 这是B. Stroustrup书《C++程序设计语言,第四版》的一个例子。不幸的是,VS拒绝了这个代码。我曾读到,这可能是微软编译器的某种缺陷,但主题是从2013年开始的,我不敢相信他们还没有修复它。这是令人沮丧

在尝试编译此代码时,MS VS2017中出现错误C2988:

template<typename T>
using Iterator<T> = typename T::iterator;
模板
使用Iterator=typename T::Iterator;
<>这是B. Stroustrup书《C++程序设计语言,第四版》的一个例子。不幸的是,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;
}
模板
使用Iterator=typename T::Iterator;
样板
标准::矢量查找(C&C,V)
{
std::向量res;
对于(自动p=c.begin();p!=c.end();++p)
如果(*p==v)
res.push_back(p);
返回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";
}
void find_all_test()
{
字符串m{“玛丽有一只小羊羔”};
for(自动p:find_all(m,'a'))
如果(*p!=“a”)

std::cerr语法与其他模板相同,但您的模板看起来有点像部分专门化(类型别名不存在这种专门化),因此编译器会感到困惑:

template<typename T>
using Iterator    = typename T::iterator;
//            ^^^ No <T> please!
模板
使用Iterator=typename T::Iterator;
//请不要!

A请。这并没有切断它。它应该是
使用Iterator=typename t::Iterator;