我在尝试编译此代码时在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章)。我浪费了一个小时的学习时间来弄清楚我做错了什么。谢谢你解决了我的问题。
答案 0 :(得分:1)
语法与其他模板相同,但你的看起来有点像部分特化(对于类型别名不存在),因此编译器会产生混淆:
template<typename T>
using Iterator = typename T::iterator;
// ^^^ No <T> please!