模板 :: 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' 元素的指针向量) 他们不一样。你的是一个指向容器类型实例的指针向量,而原始的是一个指向元素类型实例的指针向量。 最简单的改变就是将结果类型改为vector,输出改为*p 【参考方案1】:

C*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&lt;T&gt;::pointer,此外,默认分配器的 T*value_type*。我不完全确定为什么要使用 Value_type,但我假设这是 Bjarne 的想法,即替换 typename C::value_type 的元函数。

【讨论】:

我的猜测是Value_type 更容易教授,因为没有typename(在课程中与此无关)。至于Value_typePointer,我敢猜测Value_type 会在其他地方使用,而且为了这么小的好处而同时使用两者是不值得的。或者Value_type&lt;C&gt;*Pointer&lt;C&gt; 读起来好一点。第二个,对我来说,读起来不像“指向 C 元素类型的指针”。 酷,现在有意义了。如果这个 C::value_type 名称将被引用到未定义“value_type”的容器类型,会发生什么?显然它不会编译。但是如何制作真正通用的 find_all 模板?即对于 char* 字符串,我们不需要 value_type 我们可以返回指向 char 等的指针。 @chris 实际上,可能是为了保存space on the slide(第29页) @barney 好吧,除非它满足容器要求,否则它不是容器。当&lt;algorithm&gt; 中存在类似内容时,无需重新编写“find_all”。

以上是关于模板 :: Stroustrup 的示例未编译的主要内容,如果未能解决你的问题,请参考以下文章

未解决的依赖关系:sbt-plugin;2.7.0 尝试编译播放模板项目时

Stroustrup 天鹅书矢量问题

C++模板函数示例

模板模板参数和模板别名:编译器错误?

[ C++ ] template 模板进阶 (特化,分离编译)

T4 模板在构建期间未转换