6

g++ --std=c++11 main.cpp साथ जीसीसी 4.8.4 का उपयोग आउटपुट इस कोडऑटो stdMaxInt = std :: अधिकतम <int> के लिए विफलता प्रकार में विफलता;

#include <algorithm> 

template<class T> 
const T& myMax(const T& a, const T& b) 
{ 
    return (a < b) ? b : a; 
} 

int main() 
{ 
    auto myMaxInt = myMax<int>; 
    myMaxInt(1, 2); 

    auto stdMaxInt = std::max<int>; 
    stdMaxInt(1, 2); 
} 

निम्नलिखित error

error: unable to deduce ‘auto’ from ‘max<int>’ 
auto stdMaxInt = std::max<int>; 

ऐसा क्यों है myMax लेकिन std::max साथ नहीं के साथ काम करता है? और क्या हम इसे std::max के साथ काम कर सकते हैं?

+0

मुझे आपके प्रश्न का सटीक उत्तर नहीं पता है, लेकिन मुझे लगता है कि इसे इस तथ्य के साथ करना है कि ऑपरेंड योग्य होने पर std :: max को कॉन्स्ट एक्सप्रेशन के रूप में अधिभारित किया जाता है। आपके संस्करण में ऐसे अधिभार नहीं हैं, और इसलिए कोई अस्पष्टता नहीं है। विवरण में स्वयं को विसर्जित किए बिना इस समस्या से निपटने का सबसे आसान तरीका इस तरह के उपयोग परिदृश्य के लिए 'myMax' (या लैम्ब्डा, उदा।) का उपयोग करना है, लेकिन इसे इसके कार्यान्वयन में बस' std :: max' 'कहें। –

+0

@Ike 'std :: max' एक तीसरा पैरामीटर, एक तुलना ऑब्जेक्ट लेने के लिए किसी अन्य हस्ताक्षर के साथ ओवरलोड किया गया है। कंपाइलर नहीं जानता कि कौन सा ओवरलोड का इरादा है। –

+0

'decltype (auto) stdMaxInt = ...' C++ 14 के साथ स्पष्ट जानकारी दिखाता है – billz

उत्तर

5

ऐसा इसलिए है क्योंकि std::max एक ओवरलोडेड फ़ंक्शन है, इसलिए यह नहीं पता कि आप किस अधिभार को पॉइंटर बनाना चाहते हैं। आप जो अधिभार चाहते हैं उसे चुनने के लिए आप static_cast का उपयोग कर सकते हैं। जब एल्गोरिदम के लिए पारित

auto stdMaxInt = [](int const& L, int const& R) -> int const& { return std::max(L, R); }; 

यह बेहतर इनलाइन की क्षमता का लाभ हो सकता है (अपरीक्षित:

auto stdMaxInt = static_cast<const int&(*)(const int&, const int&)>(std::max<int>); 
2

static_cast जवाब @JamesRoot से काम करता है, लेकिन मेरे स्वाद के लिए, मैं एक लैम्ब्डा पसंद करते हैं)।

संबंधित मुद्दे