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


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.