模板 :: Stroustrup 的示例未编译
Posted
技术标签:
【中文标题】模板 :: Stroustrup 的示例未编译【英文标题】:Templates :: Stroustrup's example is not compiling 【发布时间】:2015-09-23 02:39:03 【问题描述】:"没有匹配的成员函数 push_back"
在 Bjarne 的 C 的原始版本中,向量是这样写的
vector<Value_type<C>*> res;
但是这个 Value_type 模板不能正常工作 所以我只是用 C* 指针替换它,仍然没有帮助
#include <vector>
#include <string>
#include <iostream>
using namespace std;
template <typename C, typename V>
vector<C*> find_all(C& c, V v)
vector<C*> res;
for (auto &x : c)
if (x==v)
res.push_back(&x);
return res;
int main()
string s = "werqewreqwreqw";
for (const auto p : find_all(s,'q'))
cout << p;
【问题讨论】:
真正的问题是为什么第一个版本不起作用。Value_type
在哪里定义?我对 Bjarne 的书籍代码不太熟悉。编辑:found it。您是否使用 C++11 和支持 using
语法的编译器进行编译?
@chris 我从视频讲座幻灯片中得到它,不幸的是,没有给出其他代码......但是为什么我们需要 value_type。仅仅定义 C* 指针不是更简单(因为我们定义了指向 C' 元素的指针向量)
他们不一样。你的是一个指向容器类型实例的指针向量,而原始的是一个指向元素类型实例的指针向量。
最简单的改变就是将结果类型改为vectorC*
与 C::value_type*
不同。实际上,已经有一个 typedef 代表相同的概念,即C::pointer
。
template <typename C, typename V>
vector<typename C::pointer> find_all(C& c, V v)
vector<typename C::pointer> res;
仅供参考,C::pointer
将是 std::allocator_traits<T>::pointer
,此外,默认分配器的 T*
或 value_type*
。我不完全确定为什么要使用 Value_type
,但我假设这是 Bjarne 的想法,即替换 typename C::value_type
的元函数。
【讨论】:
我的猜测是Value_type
更容易教授,因为没有typename
(在课程中与此无关)。至于Value_type
与Pointer
,我敢猜测Value_type
会在其他地方使用,而且为了这么小的好处而同时使用两者是不值得的。或者Value_type<C>*
比Pointer<C>
读起来好一点。第二个,对我来说,读起来不像“指向 C 元素类型的指针”。
酷,现在有意义了。如果这个 C::value_type 名称将被引用到未定义“value_type”的容器类型,会发生什么?显然它不会编译。但是如何制作真正通用的 find_all 模板?即对于 char* 字符串,我们不需要 value_type 我们可以返回指向 char 等的指针。
@chris 实际上,可能是为了保存space on the slide(第29页)
@barney 好吧,除非它满足容器要求,否则它不是容器。当<algorithm>
中存在类似内容时,无需重新编写“find_all”。以上是关于模板 :: Stroustrup 的示例未编译的主要内容,如果未能解决你的问题,请参考以下文章
未解决的依赖关系:sbt-plugin;2.7.0 尝试编译播放模板项目时