নেমস্পেস স্টাডিতে একটি টেম্পলেট ক্লাস কীভাবে ঘোষণা করবেন?


131
#ifndef __TEST__
#define __TEST__

namespace std
{
    template<typename T>
    class list;
}

template<typename T>
void Pop(std::list<T> * l)
{
    while(!l->empty())
        l->pop();
}

#endif

এবং আমার প্রধান যে ফাংশন ব্যবহার। আমি ত্রুটি পেতে। অবশ্যই, আমি জানি যে এর জন্য আরও টেম্পলেট প্যারাম রয়েছে std::list(আমার মনে হয় বরাদ্দকারী)। কিন্তু, এটি বিন্দু পাশে। আমাকে কী টেম্পলেট শ্রেণীর সম্পূর্ণ টেম্পলেট ঘোষণাটি তা ঘোষণা করতে সক্ষম হতে হবে?

সম্পাদনা: আমি আগে কোনও পয়েন্টার ব্যবহার করিনি - এটি ছিল একটি রেফারেন্স। আমি এটি পয়েন্টার দিয়ে চেষ্টা করে দেখব।


এবং তালিকার ক্ষেত্রে, দ্বিতীয় প্যারামিটারটি একটি ডিফল্ট প্যারামিটার যা হ'লstd::allocator<T>
নাকিয়া 'ই

2
যে কোনও এটি পর্যালোচনা হিসাবে বিবেচনা করতে পারে যে এসটিএলে ফরোয়ার্ড ডিক্লেয়ারেশন শিরোনাম নেই। অন্যদিকে, এর ফাইলগুলি প্রায়শই অন্তর্ভুক্ত করা হয় যে এটি সংকলনের সময় সম্ভবত কোনও উপকার পাবেন না ...
ম্যাথিউ এম।

7
__TEST__এটি একটি সংরক্ষিত শনাক্তকারী, এটি ব্যবহার করবেন না
GManNickG

উত্তর:


146

সমস্যাটি এমন নয় যে আপনি কোনও টেম্পলেট শ্রেণিকে ফরোয়ার্ড-ডিক্লেয়ার করতে পারবেন না। হ্যাঁ, এটিকে সঠিকভাবে ফরওয়ার্ড-ডিক্লেয়ার করতে সক্ষম হওয়ার জন্য আপনাকে সমস্ত টেম্পলেট প্যারামিটার এবং তাদের ডিফল্টগুলি জানতে হবে:

namespace std {
  template<class T, class Allocator = std::allocator<T>>
  class list;
}

কিন্তু এমনকি এই ধরনের একটা ফরওয়ার্ড ঘোষণা করতে namespace stdস্পষ্টভাবে মান দ্বারা নিষিদ্ধ হয়: শুধুমাত্র জিনিস আপনি রাখা করার অনুমতি দেওয়া করছি stdএকটি টেমপ্লেট বিশেষজ্ঞতা , সাধারণভাবে std::lessএকটি ব্যবহারকারী-সংজ্ঞায়িত ধরনের উপর। প্রয়োজনে অন্য কেউ প্রাসঙ্গিক পাঠ্য উদ্ধৃত করতে পারেন।

শুধু #include <list>এবং এটি সম্পর্কে চিন্তা করবেন না।

ওহ, ঘটনাক্রমে, ডাবল-আন্ডারস্কোর যুক্ত কোনও নাম প্রয়োগের দ্বারা ব্যবহারের জন্য সংরক্ষিত রয়েছে, সুতরাং আপনার TEST_Hপরিবর্তে এর মতো কিছু ব্যবহার করা উচিত __TEST__। এটি কোনও সতর্কতা বা ত্রুটি উত্পন্ন করছে না, তবে যদি আপনার প্রোগ্রামটির একটি প্রয়োগ-সংজ্ঞায়িত শনাক্তকারীর সাথে সংঘাত হয়, তবে এটি সংকলন করা বা সঠিকভাবে চালনার গ্যারান্টিযুক্ত নয়: এটি খারাপ । এছাড়াও নিষিদ্ধ নামগুলি অন্যদের মধ্যে একটি আন্ডারস্কোর দ্বারা শুরু হয় এবং তার পরে একটি মূলধনপত্র থাকে। সাধারণভাবে, আন্ডারস্কোর দিয়ে জিনিসগুলি শুরু করবেন না যদি না আপনি জানেন যে আপনি কী যাদু নিয়ে কাজ করছেন।


4
namespace stdবিটিডব্লিউতে জিনিস ঘোষণা করার জন্য কেন এটি নিষিদ্ধ ?
নাকিয়া

4
এই উত্তরটি ( স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 307343/… ) এবং লিঙ্কযুক্ত নিউজগ্রুপ আলোচনা দেখুন।
জন পূর্ব

7
জোন / নাকিয়া, কেন #pragma once# ইফদেফের চেয়ে ব্যবহার করবেন না। এটি আজকাল বেশিরভাগ সংকলক দ্বারা সমর্থিত।
চিহ্নিত করুন

11
@ মার্ক: কারণ এটি #pragma, এ কারণেই। যদিও এটি একটি বিকল্প।
জন পুর্ডি

2
এই প্রশ্নের ডিলিকেট কয়েক কোটি আছে। কেবল অনুসন্ধান করুন: stackoverflow.com/search?q=pragma+once
জন পুরি

20

আমি এই সমস্যাটি সমাধান করেছি।

আমি সি ++ (এক্লিপস জুনো) তে একটি নেটওয়ার্ক সিমুলেশনের জন্য একটি ওএসআই লেয়ার (স্লাইডার উইন্ডো, স্তর 2) বাস্তবায়ন করছিলাম। আমার ফ্রেম (টেমপ্লেট <class T>) এবং এর রাজ্যগুলি (রাষ্ট্রীয় প্যাটার্ন, ফরোয়ার্ড ঘোষণা) ছিল।

সমাধানটি নিম্নরূপ:

ইন *.cppফাইল, আপনি হেডার ফাইল অন্তর্ভুক্ত করা আবশ্যক যে আপনার ফরওয়ার্ড, অর্থাত

ifndef STATE_H_
#define STATE_H_
#include <stdlib.h>
#include "Frame.h"

template <class T>
class LinkFrame;

using namespace std;

template <class T>
class State {

  protected:
    LinkFrame<int> *myFrame;

}

এর সিপিপি:

#include "State.h"
#include "Frame.h"
#include  "LinkFrame.h"

template <class T>
bool State<T>::replace(Frame<T> *f){

এবং ... অন্য ক্লাস।


34
কোন ফেলে using namespaceএকটি শিরোলেখ ফাইলে খুব খারাপ অভ্যাস কারণ এটি স্থানীয় নাম অন্যথায় বৈধ হতে হবে ব্যবহার করতে পারবেন হওয়া থেকে যে হেডার ফাইলটি যে ব্যবহার করবেন করতে বাধা দেয়। এটি মূলত নেমস্পেসের পুরো পয়েন্টকে পরাস্ত করে।
অ্যান্ডি ডেন্ট

10

ফরোয়ার্ড ঘোষণায় সম্পূর্ণ টেম্পলেট আর্গুমেন্টের তালিকা নির্দিষ্ট করা উচিত।


-5

আপনি ব্যবহার করতে পারেন এমন একটি সীমিত বিকল্প রয়েছে

শিরোলেখ:

class std_int_vector;

class A{
    std_int_vector* vector;
public:
    A();
    virtual ~A();
};

CPP:

#include "header.h"
#include <vector>
class std_int_vector: public std::vectror<int> {}

A::A() : vector(new std_int_vector()) {}
[...]

বাস্তব প্রোগ্রামগুলিতে পরীক্ষিত নয়, সুতরাং এটি নিখুঁত হওয়ার প্রত্যাশা করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.