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

时间:2016-12-21 14:56:07

标签: c++ c++11

我在bjarne stroustrup的c ++编程语言第4版中尝试了这个例子:

for i, row in X_pca.iterrows(): 
    #print (i)
    #print (row) 
    print (X_pca.loc[i, 'a'])
    pos = X_pca.index.get_loc(i)
    print (X_pca.iloc[pos].a)

4
4
5
5
6
6

§4.5.1

我用以下代码编译代码: g ++ test.cpp -o test -g -std = c ++ 11在ubuntu上,但是我得到了以下错误:

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

那么问题是什么?

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

2 个答案:

答案 0 :(得分:6)

更改开头
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;

至少适用于普通的模板类,我认为它与使用相同。

答案 1 :(得分:0)

更改此

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

到这个

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