আমি কীভাবে স্পষ্টভাবে কোনও টেম্পলেট ফাংশন ইনস্ট্যান্ট করব?


117

আমার একটি যুক্তি সহ একটি টেম্পলেট ফাংশন রয়েছে। আমাকে সেই ক্রিয়াকলাপটি কল না করেই সেই ফাংশনটি ইনস্ট্যান্টিয়েট করতে হবে মানে স্পষ্টভাবে আমাকে তাত্ক্ষণিকভাবে চালিয়ে যেতে হবে।

আমি এই ফাংশন আছে:

template <class T> int function_name(T a) {}

আমি এই ফাংশনটি এভাবে ইনস্ট্যান্ট করেছিলাম:

template int function_name<int>(int);

তবে আমি নিম্নলিখিত ত্রুটিগুলি পেয়েছি:

error: expected primary-expression before 'template'
error: expected `;' before 'template'

উত্তর:


182

[সম্পাদনা 2]: নোট করুন যে কোড বিন্যাস সংক্রান্ত সমস্যার কারণে মূল প্রশ্নে কোড সম্পর্কে কিছু বিভ্রান্তি ছিল। আরও তথ্যের জন্য অ্যান্থনিহ্যাচকিন্সের উত্তর দেখুন।

আপনি যদি সত্যিই ফাংশনটি (বিশেষাধিকারী বা কিছু পরিবর্তে) ইনস্ট্যান্ট করতে চান তবে এটি করুন:

template <typename T> void func(T param) {} // definition

template void func<int>(int param); // explicit instantiation.

[সম্পাদনা] সুস্পষ্ট তাত্ক্ষণিকতা এবং বিশেষীকরণ সম্পর্কিত (প্রচুর) বিভ্রান্তি দেখা যাচ্ছে। উপরে পোস্ট করা কোডটি সুস্পষ্ট তাত্ক্ষণিকতার সাথে ডিল করে । বিশেষায়নের জন্য বাক্য গঠন আলাদা is এখানে বিশেষায়নের জন্য বাক্য গঠন রয়েছে:

template <typename T> void func(T param) {} // definition

template <> void func<int>(int param) {} // specialization

টেমপ্লেটের পরে কোণ বন্ধনী নোট করুন!


3
তা কি তাত্পর্য বা বিশেষত্ব ?
নওয়াজ

5
সত্য না. আপনি সংকলককে স্পষ্টভাবে টেমপ্লেট ইনস্ট্যান্ট করতে বলতে পারেন। আরও তথ্যের জন্য গুগল "সি ++ স্পষ্টতাল টেম্পলেট ইনস্ট্যান্টেশন"।
এইচআরএনটি

8
@ নাওয়াজ: আপনি ভুল বলেছেন। অবশ্যই এটি সর্বদা সংকলক হয় যা ইনস্ট্যান্ট করে, সেই লাইনটি প্রোগ্রামার থেকে টেমপ্লেট ইনস্ট্যান্ট করার জন্য সংকলককে অনুরোধ। আপনার যদি সি ++ স্ট্যান্ডার্ডের একটি অনুলিপি থাকে, তবে 14.7.2 স্পষ্টত ইনস্ট্যান্টেশন পড়ুন
ডেভিড রদ্রিগেজ - ড্রিবিস

16
বিশেষায়নের অর্থ আপনি সম্ভবত এর প্রয়োগ পরিবর্তন করছেন। ইনস্ট্যান্টেশনটির সহজ অর্থ হল আপনি এটিকে কোনও নির্দিষ্ট সংকলনের ইউনিটে অর্পণ করছেন, সম্ভবত এটির অনন্য ঠিকানা গ্রহণ করার জন্য বা এটি একটি লাইব্রেরির ফাংশন হিসাবে উপলব্ধ করা বা ব্লাট কমাতে।
ক্যাশকো

3
@ হার্ট: আমি মনে করি, আপনি ঠিক বলেছেন @ অ্যাটট: আমি কেবল লক্ষ্য করেছি যে বাক্য template<>গঠনটি গঠন করে না । তিনি যা লিখেছেন তা বিশেষীকরণ থেকে আলাদা । আমাকে এই নতুন জিনিস শেখানোর জন্য +1 আমি আমার পোস্ট অপসারণ করছি। : ডি
নওয়াজ

20

আপনার কোডটি সঠিক।

ত্রুটি বার্তাটি কোডের একটি জায়গার সাথে সম্পর্কিত যা আপনি এখানে উদ্ধৃত করেন নি।

হালনাগাদ:

মূল কোড ছিল

template <class T> int function_name(T a) {}
template int function_name<int>(int);

এবং এটি সঠিক ছিল।

তবে এটি উদ্ধৃত হয়নি এবং এভাবে দেখানো হয়েছিল :

template int function_name(T a) {}
template int function_name(int);

এটি নিম্নলিখিত ত্রুটি উত্পন্ন করে

a.cpp:1: error: explicit instantiation of non-template int function_name
a.cpp:1: error: expected `;' before ‘(’ token
a.cpp:3: error: function_name is not a template function

যা ওপি उद्धृत করেছেন তার থেকে পৃথক পৃথক।

এই রূপটিতে দ্বিতীয় লাইনটি ঠিক আছে ( <int>এখানে বাদ দেওয়া যেতে পারে) তবে প্রথম লাইনটি ত্রুটিযুক্ত। সংকলক অনুমান করতে পারে না যে Tএটি একটি টেম্পলেট প্যারামিটার।


প্রযুক্তিগতভাবে এটি তার কোড নয়, এটি বিলের সম্পাদনা ছিল :) আসল কোডটি template int function_name( T a) { }এবংtemplate int function_name(int);
এইচআরএনটি

@hrnt মূল কোডটি সঠিকভাবে ফর্ম্যাট হয়নি, তবে এটি সঠিক ছিল। আমি যদি বালাজি হতাম তবে আমি ফিরে এসে আপনার উত্তরটি যদি সে দরকারী মনে করে তবে তা গ্রহণ করতাম, তবুও আমার পক্ষে (এবং সম্ভবত অন্য কারও পক্ষে) আপনার উত্তর (পুরোপুরি সঠিকভাবে থাকা অবস্থায়) প্রশ্নের উত্তর দেয় না।
অ্যান্টনি হ্যাচকিন্স

@hrnt আপনি ঠিক বলেছেন যে মূল কোডটি এর মতো দেখায়। কিন্তু অনুমিত টেম্পলেট যুক্তির কারণে এটি এখনও কার্যকর হয়। আমাকে অ্যান্টনি হ্যাচকিন্সের সাথে একমত হতে হবে যে কোড থেকে ত্রুটিটি দেখা দিয়েছে যে ওপি উদ্ধৃতি দেয় নি, তবে আমি মনে করি যে আপনার উত্তর এখনও সেই লোকদের জন্য কার্যকর যারা স্পষ্ট তাত্পর্য সম্পর্কে জানেন না।
এমপার্ক

ঠিক আছে, উদাহরণস্বরূপ আমাকে নিতে। আমি এই পৃষ্ঠাটি গুগল করেছিলাম যখন আমি স্পষ্ট তাত্ক্ষণিক সম্পর্কে আমার ভাল-ভুলে যাওয়া জ্ঞানকে রিফ্রেশ করতে চেয়েছিলাম - এবং এটি আমার খুব বেশি উপকারে আসেনি। আমার হিসাবে, সিনট্যাক্স সম্পর্কে কোনও বিভ্রান্তি নেই। সুস্পষ্ট ইনস্ট্যান্টেশন সম্পর্কে কী বিভ্রান্তির কারণ হতে পারে তা হ'ল এটির ব্যবহার
অ্যান্টনি হ্যাচকিন্স

@ অ্যান্টনি হ্যাচকিনস আহ, সত্য - আমি আসল প্রশ্নের উত্সটির দিকে তাকাইনি, কীভাবে এটি আমার পর্দায় প্রদর্শিত হয়েছিল। আমি এটি +1 করব এবং মূল প্রশ্নটি সম্পর্কে বিভ্রান্তি নোট করতে আমার মূল উত্তরটি সংশোধন করব।
hrnt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.