तो, मैं इस तरह एक समारोह लिखने के लिए कोशिश कर रहा था:टाइपफ़ोफ़ (std :: endl) टेम्पलेट पैरामीटर के रूप में नहीं हो सकता है?
void append_to_stream(std::ostream &stream)
{ }
template <typename T, typename... Args>
void append_to_stream(std::ostream &stream, T first, Args&&... rest)
{
stream << first;
append_to_stream(stream, rest...);
}
और इसे पसंद फोन:
append_to_stream(stream,
std::endl,
std::endl);
लेकिन यह काम नहीं करता। मुझे एक त्रुटि मिलती है जो फ़ंक्शन में 'बहुत अधिक तर्क' कहती है। मैंने इसे उस बिंदु तक सीमित कर दिया है, मुझे पता है कि std::endl
दोषी है - शायद क्योंकि यह एक कार्य है। मैंने endl
नामक एक स्ट्रक्चर घोषित करके इसे 'हल' करने में कामयाब रहा और इसके लिए <<operator
परिभाषित किया ताकि यह आसानी से std::endl
पर कॉल कर सके। यह काम करता है लेकिन विशेष रूप से अच्छा महसूस नहीं करता है। क्या टेम्पलेट तर्क के रूप में std :: endl को स्वीकार करना संभव नहीं है? समारोह अन्य प्रकार के लिए काम करता है।
संपादित करें:
src/log/sinks/file_sink.cpp:62:21: error: too many arguments to function ‘void log::sinks::append_to_stream(std::string&, Args&& ...) [with Args = {}, std::string = std::basic_string<char>]’
अद्यतन
सही टेम्पलेट तर्क @MooingDuck सुझाव दिया है कि निम्न प्रपत्र के एक समारोह इस्तेमाल किया जा सकता निकालना संकलक पाने के लिए कोशिश कर रहा है: यहाँ त्रुटि है
template<class e, class t, class a>
basic_ostream<e,t>&(*)(basic_ostream<e,t>&os) get_endl(basic_string<e,t,a>& s)
{
return std::endl<e,t>;
}
हालांकि, यह संकलित नहीं होता है।
त्रुटि:
src/log/sinks/file_sink.cpp:42:28: error: expected unqualified-id before ‘)’ token
src/log/sinks/file_sink.cpp:42:53: error: expected initializer before ‘get_endl’
कोई भी विचार क्यों? इसे संकलित करने के लिए, मैंने using namespace std;
होगा क्या संकलक आप उपयोग कर रहे हैं?आईआईआरसी कुछ कंप्यूटर्स को थोड़ी देर के लिए रिकर्सन के साथ परेशानी थी। – Flexo
@awoodland मैं जीसीसी 4.6.2 का उपयोग कर रहा हूं :) – Max
'std :: endl' कोई फ़ंक्शन नहीं है, यह एक टेम्पलेट है। –