2016-12-21 17 views
1

私はビャーネ・ストロヴストルップのC++プログラミング言語第4版では例を試してみました: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テスト-g -std = C Ubuntuの上++ 11、私は以下のエラーを得た:だから問題は何である

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")) 
           ^

を?

私はちょうど本の例のコピー貼り付けを行ったので、このコードでは構文エラーは見つからないようです。

+0

@Someprogrammerdudeにこの

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

、同じエラー – SWIIWII

+0

@Someprogrammerdude gccのバージョン5.4.0 20160609(Ubuntuの〜16.04.4 5.4.0-6ubuntu1) – SWIIWII

+2

Iterator = typename T :: iterator 'を使用しているテンプレートでなければなりません –

答えて

6

変更おそらく同じコンパイラのセットアップと私のUbuntu 16.04上

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

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

の作品から始まり

なぜそれがその方法ですか?私はそれについて100%自信がない、他の誰かがそれを確認するかもしれない。それがここに意味をなさないdoesntのため

using Iterator<T> 

を書く

は、無効です。私たちは、Iteratorをテンプレート型のtypedefにして、パラメータ型の汎用イテレータ型を尋ねます。 Iterator<T>はテンプレートを特化します。 など。

少なくとも、それは通常のテンプレートクラスで動作しますが、私はそれも同様に使うと思います。

+0

しかしそれを説明できますか?なぜそれはこのように振る舞うのですか? – SWIIWII

+0

これはかなり構文的です。Iterator を使用すると、テンプレートの特殊化(私は推測されるでしょう)が、現在は必要になります。必要なものは、テンプレートイテレータです。しかし、その背後にあるC++言語の要件には自信がありません。私は私の素朴な理解の答えでそれを更新します –

+0

それは、例のコードのタイプミスでした。それは起こる。おそらく、この例は、 'using'テンプレートのエイリアス構文が異なるか、存在しなかったときに書かれました! – Yakk

0

変更私がやったことを、この

template<typename T> 
using Iterator = typename T::iterator; 
関連する問題