MSVS 别名错误 C2988 (C++)

MSVS alias error C2988 (C++)

本文关键字:C++ C2988 别名 错误 MSVS      更新时间:2023-10-16

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

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

这是B. Stroustrup的书"The C++ Programming Language,第4版"的一个例子。不幸的是,VS拒绝了这段代码。我读到这可能是Microsoft编译器的某种错误,但这个话题是从 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";
}

你知道为什么斯特劳斯特鲁普的书会有这样的错误吗?这是翻译错误(我使用波兰语翻译,因为它比原版便宜得多),或者任何拥有原始版本的人都可以检查它是否在那里发生(它是第 4.5.1 章)。我浪费了一个小时的学习时间,试图弄清楚我做错了什么。感谢您解决我的问题。

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

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