在Bjarne Stroustrup的C 书中,这个示例有什么问题

what is the wrong with this example in the c++ book of Bjarne Stroustrup

本文关键字:问题 什么 Stroustrup Bjarne 书中      更新时间:2023-10-16

我尝试了Bjarne Stroustrup的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;
}

§4.5.1

我将代码编译为:g test.cpp -o test -g -std = c 11上的ubuntu,但我在下面得到了错误:

iterator_of_iterator_version_2.cpp:9:15: error: expected ‘=’ before ‘<’ token
 using Iterator<T> = typename T::iterator;
               ^
iterator_of_iterator_version_2.cpp:9:15: error: expected type-specifier before ‘<’ token
iterator_of_iterator_version_2.cpp:12:8: error: ‘Iterator’ was not declared in this scope
 vector<Iterator<C>> find_all(C& c, V v)
        ^
iterator_of_iterator_version_2.cpp:12:17: error: template argument 1 is invalid
 vector<Iterator<C>> find_all(C& c, V v)
                 ^
iterator_of_iterator_version_2.cpp:12:17: error: template argument 2 is invalid
iterator_of_iterator_version_2.cpp:12:18: error: expected unqualified-id before ‘>’ token
 vector<Iterator<C>> find_all(C& c, V v)
                  ^
iterator_of_iterator_version_2.cpp: In function ‘void test()’:
iterator_of_iterator_version_2.cpp:24:30: error: ‘find_all’ was not declared in this scope
  for (auto p : find_all(m,'a'))
                              ^
iterator_of_iterator_version_2.cpp:29:31: error: ‘find_all’ was not declared in this scope
  for (auto p : find_all(ld,1.1))
                               ^
iterator_of_iterator_version_2.cpp:33:35: error: ‘find_all’ was not declared in this scope
  for (auto p : find_all(vs,"green"))
                                   ^
iterator_of_iterator_version_2.cpp:36:35: error: ‘find_all’ was not declared in this scope
  for (auto p : find_all(vs,"green"))
                                   ^

那是什么问题?

似乎在此代码中找不到语法错误,因为我只是对本书的示例进行了复制。

更改起点
template<typename T>
using Iterator<T> = typename T::iterator;

to

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

在我的Ubuntu 16.04上使用相同的编译器设置

为什么这样?我对此并不是100%的信心,其他人可能会验证它。

写作

using Iterator<T>

是无效的,因为这里没有意义。我们希望迭代器成为模板的Typedef,它将其参数类型询问其通用迭代器类型。 Iterator<T>将专门化模板。例如。我们知道特定类型的更好:

template<>
using Iterator<MyClass> = MyClassIterator;

至少与普通模板类配合使用,我认为使用也一样。

更改此

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

到这个

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