gpt4 book ai didi

c++ - Bjarne Stroustrup 的 c++ 书中的这个例子有什么问题

转载 作者:行者123 更新时间:2023-11-30 00:45:51 24 4
gpt4 key购买 nike

我尝试了 bjarne stroustrup 的 c++ 编程语言第 4 版中的示例:

#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;

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

在我的 ubuntu 16.04 上工作,编译器设置可能相同

为什么会这样?我对此没有 100% 的信心,请其他人验证一下。

写作

using Iterator<T>

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

template<>
using Iterator<MyClass> = MyClassIterator;

至少这适用于普通模板类,我认为它与 using 一样。

关于c++ - Bjarne Stroustrup 的 c++ 书中的这个例子有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41265684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com