2016-03-13 11 views
7

Ich lese gerade Bjarne Stroustrups "Die C++ Programmiersprache" 4. Ausgabe. In den ersten Teilen des Buches, fand ich eine Nutzung von using sieht wie folgt aus:Wie verwende ich Templates, um Aliase mit `using` zu erstellen (parametrisierte Aliase) in C++?

// Error is in these 2 lines 
template<typename T> 
using Iterator<T> = typename T::iterator; 

* siehe [**] für vollständige Programm und die Fehlermeldung *

Das ist genau das, was ich in der Seite 105. Wenn ich dies in ein komplettes Programm drehte sich um und versuchte, es zu kompilieren, g++ mir diesen Fehler masseage gab:

> g++ -std=c++14 -o fnd find_all.cpp 
find_all.cpp:13:15: error: expected '=' before '<' token 
using Iterator<T> = typename T::iterator; 
     ^
find_all.cpp:13:15: error: expected type-specifier before '<' token 

ich kann nicht fin d irgendein Problem in diesem Code (ich C++ neu bin, kann ich nicht das Problem mit meinem kleinen Wissen finden) (Mehr zum Verwechseln fand ich dieses Buch auf Bjarnes)

Könnte mir jemand sagen, warum macht dieser Code einen Fehler?

HINWEIS: Allerdings, wenn ich Iterator<C> durch ersetzt (siehe unten), funktioniert es gut, es gibt keinen Fehler!

[**] Das Gesamtprogramm und Fehlermeldung:

// Error is in these 2 lines 
template<typename T> 
using Iterator<T> = typename T::iterator; 
// ------------------------------------------- 

// For the completeness I'll include my complete program here 
template<typename C, typename V> 
vector<Iterator<C>> find_all(C& c, V v) // find all occurrences of v in c 
{ 
    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"; 

    list<double> ld { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 1.1, 1.1 }; 
    for (auto p : find_all(ld, 1.1)) 
     if (*p == 1.1) 
      cerr << "list bug!\n"; 

    vector<string> strv { "blue", "yellow", "red", "white", "orange", "blue" }; 
    for (auto p : find_all(strv, "blue")) 
     if (*p == "blue") 
      cerr << "string vector bug!\n"; 

} 

int main(void) 
{ 
    test(); 

    return 0; 
} 

Fehlermeldung:

> g++ -std=c++14 -o fnd find_all.cpp 
find_all.cpp:13:15: error: expected '=' before '<' token 
using Iterator<T> = typename T::iterator; 
     ^
find_all.cpp:13:15: error: expected type-specifier before '<' token 
find_all.cpp:16:8: error: 'Iterator' was not declared in this scope 
vector<Iterator<C>> find_all(C& c, V v) 
    ^
find_all.cpp:16:17: error: template argument 1 is invalid 
vector<Iterator<C>> find_all(C& c, V v) 
      ^
find_all.cpp:16:17: error: template argument 2 is invalid 
find_all.cpp:16:18: error: expected unqualified-id before '>' token 
vector<Iterator<C>> find_all(C& c, V v) 
      ^
find_all.cpp: In function 'void test()': 
find_all.cpp:30:31: error: 'find_all' was not declared in this scope 
    for (auto p : find_all(m, 'a')) 
         ^
find_all.cpp:35:32: error: 'find_all' was not declared in this scope 
    for (auto p : find_all(ld, 1.1)) 
          ^
find_all.cpp:40:37: error: 'find_all' was not declared in this scope 
    for (auto p : find_all(strv, "blue")) 

Antwort

12

Erste <T>

verzichtet werden muss
template<typename T> 
using Iterator = typename T::iterator; 
+1

danke sehr viel, es funktioniert jetzt. Es scheint ein Tippfehler in dem Buch zu sein, Danke – 0xEDD1E

6

Wenn Sie eine Klasse definieren Vorlage oder Funktionsvorlage, Sie u se:

template <typename T> struct Foo { }; 

template <typename T> T bar() { return T{}; } 

nicht benötigt Foo<T> oder bar<T>, wenn die Vorlagen zu definieren.

Ähnlich, wenn Vorlagen mit einem Alias ​​zu definieren, müssen Sie verwenden:

template <typename T> 
using Iterator = typename T::iterator; 
      ^^ Don't include <T>