টেমপ্লেট এবং অস্পষ্টতার স্বয়ংক্রিয় ফেরতের প্রকার


20

আমার একটি অতিরিক্ত লোড টেম্পলেট ফাংশন রয়েছে:

template<typename T1, typename T2>
auto overMax(T1 a, T2 b)
{
    std::cout << __FUNCSIG__ << std::endl;

    return b < a ? a : b;
}

template<typename RT, typename T1, typename T2>
RT overMax(T1 a, T2 b)
{
    std::cout << __FUNCSIG__ << std::endl;

    return b < a ? a : b;
}

আমি যদি এটিকে কল করি:

auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template

সবকিছু নিখুঁত কাজ করে, কিন্তু

auto c = overMax<int>(4, 7.2); // error

অস্পষ্ট কল কারণ।

এটি কেন আন্ত , এবং ঠিক আছে অন্য কোন ধরণের সাথে?


4
আমি মনে করি ... .... সংকলকটি যেভাবে এটি দেখছে, তা হ'ল: এর সাথে intআপনি কি নির্দিষ্ট করছেন typename RTবা typename T1? যেহেতু 4এটিও একটি int, এটিও হতে পারে। সঙ্গে double, 4না সরাসরি টাইপ মেলে double, তাই দ্বিতীয় জমিদার পছন্দ করা হয়।
ক্রিসএম

এটি আমার কাছে খানিকটা দু: খজনক দেখাচ্ছে কারণ আপনি রিটার্নের ধরণে ওভারলোডিংয়ের ধরণে কিন্তু বিভিন্ন পরিমাণে পরামিতিযুক্ত টেম্পলেটগুলির সাথে রয়েছেন।
বোরগ্লেডার

উত্তর:


25

RTছাড়যোগ্য নয়, সুতরাং এটি সরবরাহ না করার সময়, কেবলমাত্র কল করা template<typename T1, typename T2> auto overMax(T1 a, T2 b)যেতে পারে।

আপনি যখন (আংশিকভাবে) একটি টেম্পলেট যুক্তি সরবরাহ করেন, উভয় পদ্ধতিই কার্যকর হয়,

তবে যুক্তির উপর নির্ভর করে একজন আরও ভাল প্রার্থী হতে পারেন:

  • জন্য auto b = overMax<double>(4, 7.2); // uses second template

    উভয় overMax<double, int, double>এবং overMax<double, double>টেকসই।
    কিন্তু overMax<double, int, double>সঠিক মিল IS
    যেহেতু overMax<double, double>প্রয়োজন intথেকে doubleরূপান্তর।

  • জন্য auto c = overMax<int>(4, 7.2); // Ambiguous call

    উভয় overMax<int, int, double>এবং overMax<int, double>টেকসই।
    তবে দুটিও ভাল ম্যাচ বা আরও বিশেষায়িত নয়, তাই কলটি অস্পষ্ট।


কেন তাদের উভয়ই অনেক বেশি ভাল? আমি কি ঠিক বলেছি যে মুঠির ক্ষেত্রে ম্যাক্স <মিন্টের চেয়ে বেশি (4, 7.2); রূপান্তর কারণ হবে 7.2 থেকে int । এবং দ্বিতীয় ক্ষেত্রে প্রত্যাশিত ফলাফল, যা প্রাথমিকভাবে দ্বিগুণ , স্পষ্ট <int> এর কারণে INT তে রূপান্তরিত হবে ?
পরিবর্ধক

1
@ অ্যাম্প্লিফায়ার: overMax<int>(4, 7.2)প্রথম ক্ষেত্রে T1=int(সরবরাহ করা), T2=double(ছাড়) এবং দ্বিতীয় ক্ষেত্রে RT=int(সরবরাহ করা), T1=int, T2=double(ছাড়) হবে। উভয় পদ্ধতির সামগ্রীর সংজ্ঞা ওভারলোড নির্বাচন করতে ব্যবহৃত হয় না।
জারোড 42

আমার ক্ষেত্রে, দ্বিতীয় ক্ষেত্রেটি উপযুক্ত, যেহেতু প্রথমটির জন্য রিটার্ন ধরণের রূপান্তর আছে এবং দ্বিতীয়টির জন্য কোনও রূপান্তর নেই, তাই না?
পরিবর্ধক

হুমম ... রিটার্ন টাইপ রূপান্তর ভূমিকা রাখে না ... তারপরে হ্যাঁ, উভয় কলই এই দৃষ্টিকোণ থেকে সমতুল্য
পরিবর্ধক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.