मैं एसवीएन से जीसीसी में अवधारणाओं के लाइट के साथ प्रयोग कर रहा हूं। मैंने एक ऐसी समस्या पर मारा है जो मुझे संदेह की कमी के कारण है, और अगर कोई मुझे सही दिशा में इंगित कर सकता है तो मैं इसकी सराहना करता हूं। मेरे कोड है:अवधारणाओं और घोषणा आदेश
#include <iostream>
#include <string>
// Uncomment this declaration to change behaviour
//void draw(const std::string&);
template <typename T>
concept bool Drawable() {
return requires (const T& t) {
{ draw(t) }
};
}
void draw(const std::string& s)
{
std::cout << s << "\n";
}
int main()
{
static_assert(Drawable<std::string>()); // Fails
}
यहाँ मैं एक सरल अवधारणा है, Drawable
है, जो आवश्यक है कि एक प्रकार const T&
की एक पैरामीटर, समारोह draw(t)
compiles दिया इरादा है परिभाषित करते हैं।
मैं फिर एक फ़ंक्शन draw(const std::string&)
परिभाषित करता हूं जो स्ट्रिंग को cout
पर "खींचता है"। अंत में, मैं जांचता हूं कि std::string
Drawable
अवधारणा से मेल खाता है - जिसे मैं उम्मीद करता था, क्योंकि उपयुक्त draw()
फ़ंक्शन उस दायरे में है जब static_assert
कहा जाता है।
हालांकि, स्थैतिक जोर विफल रहता है, जब तक कि draw(const std::string&)
की अवधारणा अवधारणा परिभाषा से पहले, और मुझे नहीं पता कि क्यों।
क्या यह अवधारणाओं के साथ अपेक्षित व्यवहार है, या क्या मैं कुछ गलत कर रहा हूं?
सैकड़ों डुप्लिकों के साथ बोग-मानक एडीएल समस्या। एडीएल वैश्विक नामस्थान का निरीक्षण नहीं करेगा क्योंकि इसमें शामिल किसी भी प्रकार के सदस्य नहीं हैं। टेम्पलेट के ऊपर की घोषणा को अपूर्ण करने से अस्थायी-नाम-लुकअप को टेम्पलेट परिभाषा संदर्भ में ढूंढने में सक्षम बनाता है। – Columbo
तो अगर वह नेमस्पेस std में उस शून्य ड्रा घोषणा को डालता है। यह काम करना चाहिए। – West
मुझे उद्घाटन वाक्य में एसवीएन संदर्भ गुम है। क्या यह किसी भी तरह से महत्वपूर्ण है? –