আমি কেন ডাবল কলোন ব্যবহার করে একটি নেমস্পেসে একটি ক্লাস ফরওয়ার্ড-ঘোষণা করতে পারি না?


164
class Namespace::Class;

আমাকে কেন এটি করতে হবে ?:

namespace Namespace {
    class Class;
}

ভিসি ++ 8.0 ব্যবহার করে, সংকলকটি ইস্যু করে:

ত্রুটি C2653: 'নেমস্পেস': কোনও শ্রেণি বা নেমস্পেসের নাম নয়

আমি ধরে নিই যে এখানে সমস্যাটি হ'ল সংকলকটি Namespaceক্লাস বা নেমস্পেস কিনা তা বলতে পারে না ? তবে কেন এটি বিষয়টি কেবলমাত্র একটি অগ্রণী ঘোষণার পরে?

কিছু নেমস্পেসে সংজ্ঞায়িত কোনও শ্রেণি ফরোয়ার্ড-ডিক্লেয়ার করার কি অন্য উপায় আছে? উপরের সিনট্যাক্সটি মনে হয় যে আমি নামস্থানটি "পুনরায় খুলছি" এবং এর সংজ্ঞাটি প্রসারিত করছি। আসলে যদি Classসংজ্ঞায়িত না হত Namespace? এর ফলে কি কোনও সময় ত্রুটি ঘটবে?


44
আমাকে এখানে সমস্ত উত্তরগুলির সাথে একমত হতে দিন এবং বলুন যে এটি কেবল ভাষার একটি নকশা বাগ রয়েছে। তারা আরও ভাল চিন্তা করতে পারে।
পাভেল রদজিভিলভস্কি

এটি কেন সি ++ (যা বিষয়গত) অবৈধ তা নিয়ে আলোচনার দিকে ঝুঁকছে এবং এটি বিতর্কিত দেখাচ্ছে। ভোট বন্ধ
ডেভিড থর্নলি

7
কিভাবে কম্পাইলার জানাতে চাই যে, এ অনুমিত হয় একটি নামস্থান আইডেন্টিফায়ার পরিবর্তে একটি বর্গ নাম? A::BA
ডেভিড আর ট্রিবিলে

@ স্টিংআরএসসি: আলোচনার বিষয়বস্তু রয়েছে যে সি ++ কেন এটি করে তার একটি পরিষ্কার উত্তর নেই, তাই আমরা অনুমান করছি। (প্রশ্নটি শটগান প্রশ্ন, উদ্দেশ্যমূলক উত্তরগুলির সাথে কিছু প্রশ্ন রয়েছে, যার উত্তর ইতিমধ্যে দেওয়া হয়েছে)) সেই সময়ে আমি যুক্তির চিহ্নগুলির প্রতি সংবেদনশীল হয়ে উঠি এবং পাভেলের সাথে আপনার চুক্তিটি এটি সি ++ এর যোগ্যতা বাছাইয়ের যোগ্যতা রয়েছে। Namespaceশ্রেণি বা নেমস্পেস হলে কেন এটি গুরুত্বপূর্ণ তা নিয়ে একটি প্রশ্ন নিয়ে আমার সমস্যা নেই । বাক্যবিন্যাসের সাথে একটি ভাষা শিখা যুদ্ধ শুরু করার সম্ভাবনার ইঙ্গিতের কাছাকাছি কোথাও পৌঁছাবেন না।
ডেভিড থর্নলি

উত্তর:


85

কারণ আপনি পারবেন না। সি ++ ভাষায় সম্পূর্ণরূপে যোগ্য নামগুলি কেবল বিদ্যমান (যেমন পূর্বে ঘোষিত) সত্তাগুলির উল্লেখ করতে ব্যবহৃত হয় । এগুলি নতুন সত্ত্বা প্রবর্তন করতে ব্যবহার করা যাবে না ।

আর তুমি হয় আসলে "পুনরায় খোলার" নামস্থান নতুন সত্ত্বা প্রচার করিবার জন্য। যদি ক্লাসটি Classপরে আলাদা আলাদা নেমস্পেসের সদস্য হিসাবে সংজ্ঞায়িত করা হয় - তবে এটি সম্পূর্ণ আলাদা শ্রেণি যা এখানে আপনি ঘোষণা করেছেন এমনটির সাথে কোনও সম্পর্ক নেই।

একবার আপনি পূর্ব-ঘোষিত শ্রেণীর সংজ্ঞা দেওয়ার বিন্দুতে পৌঁছে গেলে আপনাকে আবার नेमস্পেসটি "পুনরায় খুলতে হবে" না। আপনি এটি বিশ্বব্যাপী নেমস্পেসে (বা আপনার যে কোনও নেমস্পেসকে ঘিরে রয়েছে Namespace) হিসাবে এটি সংজ্ঞায়িত করতে পারেন

class Namespace::Class {
  /* whatever */
};

যেহেতু আপনি এমন একটি সত্তার কথা উল্লেখ করছেন যা ইতিমধ্যে নেমস্পেসে ঘোষিত হয়েছে Namespace, আপনি যোগ্য নাম ব্যবহার করতে পারেন Namespace::Class


10
@STingRaySC: করার জন্য একটি নেস্টেড বর্গ ফরোয়ার্ড-ঘোষণা একমাত্র উপায় ভিতরে ঘোষণা করা হয় সংজ্ঞা এনক্লোজিং ক্লাস এর। এবং ঘিরে থাকা শ্রেণীর সংজ্ঞার আগে নেস্টেড শ্রেণিকে এগিয়ে-ঘোষণা করার কোনও উপায় নেই।
এএনটি

@ এসটিআরএসসি: একটি নেস্টেড ক্লাসে fwd ঘোষণা করা যেতে পারে - আমার উত্তর দেখুন।
জন ডিবলিং

8
@ জন ডিবলিং: নেস্টেড ক্লাস হল অন্য শ্রেণীর ভিতরে ঘোষিত একটি শ্রেণি। নেমস্পেসের অভ্যন্তরে তত্ক্ষণাত্ ঘোষিত একটি শ্রেণি নেস্টেড শ্রেণি নয়। আপনার উত্তরে সংবেদনশীল ক্লাসগুলি সম্পর্কে কিছুই নেই।
পিপীলিকা

198

আপনি সঠিক উত্তর পেয়ে যাচ্ছেন, আমাকে কেবল পুনরায় শব্দের চেষ্টা করতে দিন:

class Namespace::Class;

আমাকে কেন এটি করতে হবে?

আপনাকে এটি করতে হবে কারণ শব্দটি Namespace::Classসংকলকটি বলছে:

... ঠিক আছে, সংকলক নেমস্পেস নামের নাম স্থানটি অনুসন্ধান করুন এবং এর মধ্যে ক্লাস নামের ক্লাসটি উল্লেখ করুন।

তবে সংকলকটি আপনি কী সম্পর্কে কথা বলছেন তা জানে না কারণ এটি কোনও নাম ঠিকানাটি জানেন না Namespace। এমনকি যদি এখানে একটি নেমস্পেসের নাম দেওয়া Namespaceথাকে:

namespace Namespace
{
};

class Namespace::Class;

এটি এখনও কাজ করবে না, কারণ আপনি name নেমস্পেসের বাইরে থেকে একটি নেমস্পেসের মধ্যে কোনও শ্রেণি ঘোষণা করতে পারবেন না। আপনাকে নেমস্পেসে থাকতে হবে।

সুতরাং, আপনি প্রকৃতপক্ষে একটি নেমস্পেসের মধ্যে একটি বর্গ ঘোষণা করতে পারেন। শুধু এটি করুন:

namespace Namespace
{
    class Class;
};

39
অন্যান্য সমস্ত উত্তর আমার কাছে বিভ্রান্তিকর ছিল তবে এটি "আপনি সেই নামস্থানটির বাইরে থেকে কোনও একটি নেমস্পেসের মধ্যে কোনও শ্রেণি ঘোষণা করতে পারবেন না You আপনাকে নেমস্পেসে থাকতে হবে।" মনে রাখা খুব সহায়ক ইঙ্গিত ছিল।
ছদ্মবেশী

22

আমি মনে করি এটি একই কারণে আপনি একসাথে নেস্টেড নেমস্পেসগুলি ঘোষণা করতে পারবেন না:

namespace Company::Communications::Sockets {
}

এবং আপনার এটি করতে হবে:

namespace Company {
  namespace Communications {
    namespace Sockets {
    }
  }
}

1
এটি আসলে আপনি কেন এটি করতে পারবেন না তা ব্যাখ্যা করার কোনও উত্তর নয়।
স্টারপাইলট

6
এটি একটি উত্তর যা আমার
বেশিরভাগ

17
C ++ 17 এটি যুক্ত করে।
rparolin

এখানে আপনি জানেন যে সমস্ত নামস্থান। তবে ক্লাস কোম্পানির সাথে :: যোগাযোগ :: সকেট আপনি জানেন না যে যোগাযোগগুলি কোনও একটি নামস্থান বা কোনও শ্রেণি (যেখানে সকেটটি নেস্টেড বর্গ)।
লোথার

11

এটি কোনও ফরোয়ার্ড ঘোষিত ভেরিয়েবলের ধরণ আসলে কী তা পরিষ্কার নয়। ফরোয়ার্ড ঘোষণার class Namespace::Class;অর্থ হতে পারে

namespace Namespace {
  class Class;
}

অথবা

class Namespace {
public:
  class Class;
};


6
আমি মনে করি এটি সেরা উত্তরগুলির মধ্যে একটি, কারণ এটি উত্তর দেয় কেন এটি সহজেই সংকলক দ্বারা নির্ধারণ করা যায় না।
ডিভোলাস

1

এটিকে অস্বীকার করার সাথে যুক্তি সম্পর্কিত সম্পর্কে অনেক দুর্দান্ত উত্তর রয়েছে। আমি কেবল বিরক্তিকর স্ট্যান্ডার্ডিজ ক্লজটি সরবরাহ করতে চাই বিশেষত এটি নিষিদ্ধ। এটি C ++ 17 (n4659) এর ক্ষেত্রে সত্য।

প্রশ্নের অনুচ্ছেদে হ'ল [শ্রেণী.নাম] / 2 :

ক্লাস-কী শনাক্তকারীদের সমন্বয়ে একটি ঘোষণা ; হয় হয় বর্তমান সুযোগে নামের একটি পুনঃনির্ধারণ বা শ্রেণীর নাম হিসাবে শনাক্তকারীর একটি সামনের ঘোষণা ration এটি ক্লাসের নামটিকে বর্তমানের সুযোগের সাথে পরিচয় করিয়ে দেয়।

উপরোক্তগুলি একটি অগ্রণী ঘোষণা (বা শ্রেণীর পুনঃনির্মাণ) গঠন করে তা সংজ্ঞায়িত করে। মূলত, এটি একটি ব্যবহার করা আবশ্যক class identifier;, struct identifier;বা union identifier;যেখানে identifer সাধারণ আভিধানিক সংজ্ঞা নেই [lex.name] :

identifier:
  identifier-nondigit
  identifier identifier-nondigit
  identifier digit
identifier-nondigit:
  nondigit
  universal-character-name
nondigit: one of
  a b c d e f g h i j k l m
  n o p q r s t u v w x y z
  A B C D E F G H I J K L M
  N O P Q R S T U V W X Y Z _
digit: one of
  0 1 2 3 4 5 6 7 8 9

কমন স্কিমের উত্পাদন যা [a-zA-Z_][a-zA-Z0-9_]*আমরা সকলেই পরিচিত। আপনি দেখতে পাচ্ছেন যে, এটি class foo::bar;একটি বৈধ ফরোয়ার্ড ঘোষণা হতে বাধা দেয় কারণ foo::barকোনও সনাক্তকারী নয়। এটি সম্পূর্ণরূপে যোগ্য নাম, কিছু আলাদা।

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