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"))
danke sehr viel, es funktioniert jetzt. Es scheint ein Tippfehler in dem Buch zu sein, Danke – 0xEDD1E