这个例子在c++;比亚恩·斯特罗斯图普书 本贾尼·斯特劳斯特卢普的C++程序设计语言第四版: #include <iostream> #include <string> #include <vector> #include <list> using namespace std; template<typename T> using Iterator<T> = typename T::iterator; template<typename C, typename V> vector<Iterator<C>> find_all(C& c, V v) { vector<Iterator<C>> res; for (auto p = c.begin(); p!=c.end(); ++p) if (*p==v) res.push_back(p); return res; } void test() { string m {"Mary had a little lamb"}; for (auto p : find_all(m,'a')) if (*p!='a') cerr << "string bug!\n"; // p is a str ing::iterator list<double> ld {1.1, 2.2, 3.3, 1.1}; for (auto p : find_all(ld,1.1)) if (*p!=1.1) cerr << "list bug!\n"; vector<string> vs { "red", "blue", "green", "green", "orange", "green" }; for (auto p : find_all(vs,"green")) if (*p!="green") cerr << "vector bug!\n"; for (auto p : find_all(vs,"green")) *p = "ver t"; } int main() { test(); return 0; } #包括 #包括 #包括 #包括 使用名称空间std; 模板 使用Iterator=typename T::Iterator; 模板 矢量查找(C&C,V) { 向量res; 对于(自动p=c.begin();p!=c.end();++p) 如果(*p==v) res.push_back(p); 返回res; } 无效测试() { 字符串m{“玛丽有一只小羊羔”}; for(自动p:find_all(m,'a')) 如果(*p!=“a”) cerr

这个例子在c++;比亚恩·斯特罗斯图普书 本贾尼·斯特劳斯特卢普的C++程序设计语言第四版: #include <iostream> #include <string> #include <vector> #include <list> using namespace std; template<typename T> using Iterator<T> = typename T::iterator; template<typename C, typename V> vector<Iterator<C>> find_all(C& c, V v) { vector<Iterator<C>> res; for (auto p = c.begin(); p!=c.end(); ++p) if (*p==v) res.push_back(p); return res; } void test() { string m {"Mary had a little lamb"}; for (auto p : find_all(m,'a')) if (*p!='a') cerr << "string bug!\n"; // p is a str ing::iterator list<double> ld {1.1, 2.2, 3.3, 1.1}; for (auto p : find_all(ld,1.1)) if (*p!=1.1) cerr << "list bug!\n"; vector<string> vs { "red", "blue", "green", "green", "orange", "green" }; for (auto p : find_all(vs,"green")) if (*p!="green") cerr << "vector bug!\n"; for (auto p : find_all(vs,"green")) *p = "ver t"; } int main() { test(); return 0; } #包括 #包括 #包括 #包括 使用名称空间std; 模板 使用Iterator=typename T::Iterator; 模板 矢量查找(C&C,V) { 向量res; 对于(自动p=c.begin();p!=c.end();++p) 如果(*p==v) res.push_back(p); 返回res; } 无效测试() { 字符串m{“玛丽有一只小羊羔”}; for(自动p:find_all(m,'a')) 如果(*p!=“a”) cerr,c++,c++11,C++,C++11,改变起始值 template<typename T> using Iterator<T> = typename T::iterator; 模板 使用Iterator=typename T::Iterator; 到 模板 使用Iterator=typename T::Iterator; 在我的ubuntu 16.04上使用可能相同的编译器设置 为什么会这样?我不是百分之百有信心,请其他人核实一下 书写 using Iterator<T> 使用迭代器 无

改变起始值

template<typename T>
using Iterator<T> = typename T::iterator;
模板
使用Iterator=typename T::Iterator;

模板
使用Iterator=typename T::Iterator;
在我的ubuntu 16.04上使用可能相同的编译器设置

为什么会这样?我不是百分之百有信心,请其他人核实一下

书写

using Iterator<T>
使用迭代器
无效,因为它在这里没有意义。我们希望迭代器是一个模板化的typedef,它将向其参数类型询问其泛型迭代器类型。
迭代器将专门化模板。
例如,我们更了解特定类型:

template<>
using Iterator<MyClass> = MyClassIterator;
模板
使用迭代器=MyClass迭代器;

至少这适用于普通模板类,我认为使用也一样。

更改开头

template<typename T>
using Iterator<T> = typename T::iterator;
模板
使用Iterator=typename T::Iterator;

模板
使用Iterator=typename T::Iterator;
在我的ubuntu 16.04上使用可能相同的编译器设置

为什么会这样?我不是百分之百有信心,请其他人核实一下

书写

using Iterator<T>
使用迭代器
无效,因为它在这里没有意义。我们希望迭代器是一个模板化的typedef,它将向其参数类型询问其泛型迭代器类型。
迭代器将专门化模板。
例如,我们更了解特定类型:

template<>
using Iterator<MyClass> = MyClassIterator;
模板
使用迭代器=MyClass迭代器;
至少这适用于普通模板类,我认为使用也一样。

更改此选项

 template<typename T>
 using Iterator<T> = typename T::iterator;
模板
使用Iterator=typename T::Iterator;
对此

template<typename T>
using Iterator = typename T::iterator;
模板
使用Iterator=typename T::Iterator;
更改此选项

 template<typename T>
 using Iterator<T> = typename T::iterator;
模板
使用Iterator=typename T::Iterator;
对此

template<typename T>
using Iterator = typename T::iterator;
模板
使用Iterator=typename T::Iterator;

@Someprogrammerdude我也是这么做的errors@Someprogrammerdudegcc版本5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.4)应该是“template using Iterator=typename T::Iterator”吗?你从书中正确复制了代码吗?因为like@jonas_toth说你不应该使用类型别名的template参数。我快速测试了它,用同一个编译器编译。这也很简单much@Someprogrammerdude我也是这么做的errors@Someprogrammerdudegcc版本5.4。0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.4)应该是“template using Iterator=typename T::Iterator”吗?你从书中正确地复制了代码吗?因为like@jonas_toth说你不应该使用类型别名的模板参数。我快速测试了它,用同一个编译器编译。这太多了。但是你能解释一下吗?它为什么会这样?这是相当有语法性的c、 使用迭代器将是一种模板专门化(我猜)但是,我不希望它后面的C++语言需求。我会用我幼稚的理解来更新它,它是示例代码中的一个类型。它发生了。可能是在<>代码>使用< /COD>模板别名语法不同的时候,或者不存在。!更新了这篇文章,现在可能更清楚了为什么它有问题了(并且有一条错误消息:D),但是你能解释一下吗?为什么它会这样?这是一种语法。使用迭代器将是一种模板专门化(我猜)但是,我不希望它后面的C++语言需求。我会用我幼稚的理解来更新它,它是示例代码中的一个类型。它发生了。可能是在<>代码>使用< /COD>模板别名语法不同的时候,或者不存在。!更新了帖子,现在可能更清楚了为什么它有问题(并且有一条错误消息:D)