2016-05-12 17 views
1
#include <vector> 
#include <iostream> 
#include <string> 
using namespace std; 

#include <vector> 
#include <iostream> 
#include <string> 
using namespace std; 
// Template-template argument must 
// be a class; cannot use typename: 
template<typename T, template<typename> class C> 
void print2(C<T>& c) { 
    copy(c.begin(), c.end(), 
     ostream_iterator<T>(cout, " ")); 
    cout << endl; 
} 
int main() { 
    vector<string> v(5, "Yow!"); 
    print2(v); 
} ///:~ 

Dieser Code sieht perfekt für mich. Aber dieses Snippet kann nicht in Mein Mac kompiliert werden. Die Fehlerinformation ist die folgendeVorlage Vorlage Argument in C++

note: candidate template ignored: substitution failure [with T = std::__1::basic_string<char>]: template template argument has 
     different template parameters than its corresponding template template parameter 

    void print2(C<T>& c) { 
     ^
    1 error generated. 

Antwort

4

Dies liegt daran, std::vector kein einziges Argument Vorlage ist. Standard schreibt einen Elementtyp und Zuordnungstypargumente für std::vector vor.

Wenn Sie nicht auf legacy C++ sind und variadische Vorlagen verwenden können, können Sie Ihre Funktion wie folgt erklären:

template<typename T, template<typename...> class C> 
void print2(C<T>& c); 
+0

Dieser Code wird kopiert von in C++ zu denken. Es kompiliert in gcc mit Version 3.3.1. Ich denke, die Definition von Vektor hat sich seitdem sehr verändert. – zhexuany

+0

@zhexuany, bitte tu dir selbst einen Gefallen und werde dieses Eiszeitartefakt los. – SergeyA

+1

"Ihre Implementierung könnte sogar mehr als das haben" - nein, es sind genau zwei. Alles andere ist nicht konform. –

Verwandte Themen