मेरे पास एक आंत महसूस नहीं है VS2012 इस पर गलत है, लेकिन मुझे यकीन नहीं है।प्रोग्राम विजुअल स्टूडियो 2012 में चलता है लेकिन ideone.com
this question देखने के बाद, मुझे ऐसा कुछ लागू करने की कोशिश करने की तरह लगा।
मेरा संस्करण विजुअल स्टूडियो 2012 पर ठीक काम करता है, लेकिन Ideone पर संकलित भी नहीं करता है।
#include <iostream>
#include <string>
template <class In, class Out>
struct Pipe
{
typedef In in_type ;
typedef Out out_type ;
In in_val ;
Pipe (const in_type &in_val = in_type()) : in_val (in_val)
{
}
virtual auto operator()() const -> out_type
{
return out_type() ;
}
};
template <class In, class Out, class Out2>
auto operator>> (const Pipe <In, Out> &lhs, Pipe <Out, Out2> &rhs) -> Pipe <Out, Out2>&
{
rhs = lhs() ;
return rhs ;
}
template <class In, class Out>
auto operator>> (const Pipe <In, Out> &lhs, Out &rhs) -> Out&
{
rhs = lhs() ;
return rhs ;
}
यहाँ कुछ परीक्षण वर्ग हैं::
struct StringToInt : public Pipe <std::string, int>
{
StringToInt (const std::string &s = "") : Pipe <in_type, out_type> (s)
{
}
auto operator()() const -> out_type
{
return std::stoi (in_val) ;
}
};
struct IntSquare : public Pipe <int, int>
{
IntSquare (int n = 0) : Pipe <in_type, out_type> (n)
{
}
auto operator()() const -> out_type
{
return in_val * in_val ;
}
};
struct DivideBy42F : public Pipe <int, float>
{
DivideBy42F (int n = 0) : Pipe <in_type, out_type> (n)
{
}
auto operator()() const -> out_type
{
return static_cast <float> (in_val)/42.0f ;
}
};
और यहाँ चालक है:
यहाँ मेरी मुख्य इंटरफेस है
int main()
{
float out = 0 ;
StringToInt ("42") >> IntSquare() >> DivideBy42F() >> out ;
std::cout << out << "\n" ;
return 0 ;
}
Ideone टेम्पलेट कटौती के बारे में शिकायत कर रहा है और यह सही operator>>
उम्मीदवार समारोह खोजने में असमर्थ है:
prog.cpp: In function ‘int main()’:
prog.cpp:75:21: error: no match for ‘operator>>’ (operand types are ‘StringToInt’ and ‘IntSquare’)
StringToInt ("42") >> IntSquare() >> DivideBy42F() >> out ;
^
prog.cpp:75:21: note: candidates are:
prog.cpp:23:6: note: Pipe<Out, Out2>& operator>>(const Pipe<In, Out>&, Pipe<Out, Out2>&) [with In = std::basic_string<char>; Out = int; Out2 = int]
auto operator>> (const Pipe <In, Out> &lhs, Pipe <Out, Out2> &rhs) -> Pipe <Out, Out2>&
^
prog.cpp:23:6: note: no known conversion for argument 2 from ‘IntSquare’ to ‘Pipe<int, int>&’
prog.cpp:30:6: note: template<class In, class Out> Out& operator>>(const Pipe<In, Out>&, Out&)
auto operator>> (const Pipe <In, Out> &lhs, Out &rhs) -> Out&
^
prog.cpp:30:6: note: template argument deduction/substitution failed:
prog.cpp:75:35: note: deduced conflicting types for parameter ‘Out’ (‘int’ and ‘IntSquare’)
StringToInt ("42") >> IntSquare() >> DivideBy42F() >> out ;
कौन सा संकलक सही है? यदि विचार सही है, तो क्या इस कोड के लिए कोई आसान फिक्स है?
(* शायद डुप्लिकेट? *) से संबंधित: [गैर-कॉन्स्ट संदर्भ अस्थायी, विजुअल स्टूडियो बग से बंधे हैं?] (Http://stackoverflow.com/q/16380966/1708801) ... मूल रूप से gcc यहां सही है । यदि आप विजुअल स्टूडियो में '/ Za' के साथ बनाते हैं तो यह भी असफल हो जाएगा, [इसे लाइव देखें] (http://rextester.com/GYMOJ23021)। –
इस सवाल को बंद करने के लिए मतदान करने के लिए मूर्खतापूर्ण है * यह कोड क्यों काम नहीं कर रहा है *। परीक्षण छोटा हो सकता है लेकिन यह संकलक के बीच विवादित परिणामों के साथ एक पूर्ण परीक्षण केस है और यह निश्चित रूप से सही नहीं है जो कि सही है। –