2017-12-18 4 views
0

Um C++ - Konzepte zu lernen, habe ich versucht, ein EqualityComparable Konzept zu erstellen. Hier ist der Code, den ich schriebC++ - Konzepte und Std :: Cout

#include <iostream> 

template<typename T> 
concept bool EqualityComparable = requires(T a, T b) 
{ 
    {a == b}; 
    {a != b}; 
}; 


void foo(EqualityComparable a, EqualityComparable b) 
{ 
    //auto t = a == b; 
    //std::cout << t; //Case 1 : This compiles 
    std::cout << a == b; //Case 2 : This does not 
} 

int main() 
{ 
    foo(4,2); 
} 

Die Idee ist ziemlich einfach, es ist eine Funktion foo mit zwei Argumenten zu haben, die Betreiber unterstützen == und != jedoch, wenn ich verwende ich versuche, direkt zu vergleichen a und b in einem rufen std::cout i die folgenden Compiler-Fehler

main.cpp: In instantiation of 'void foo(auto:1, auto:1) [with auto:1 = int]': main.cpp:19:12: required from here main.cpp:14:20: error: no match for 'operator==' (operand types are 'std::basic_ostream' and 'int')

, wie ich in dem Kommentar, sagte bekommen, wenn ich a und b erste und rufen Sie dann vergleichen std :: cout alles funktioniert. Also meine Frage ich: Warum schließt GCC meine Typen std::basic_ostream und int im Fall 2? Ich benutze coliru den Code mit den folgenden Argumenten

g++ -std=c++1z -O2 -fconcepts -Wall -pedantic -pthread main.cpp && ./a.out

+4

'std :: cout << (a == b); 'weil Betreiber Vorrang, und so und so – StoryTeller

+0

Oh yeah coures, alberne mich – Pumkko

Antwort