نسخة منشئ لا يسمى، ولكن المترجم يشكو أنه لا يوجد

StackOverflow https://stackoverflow.com/questions/1932700

  •  20-09-2019
  •  | 
  •  

سؤال

ونظرا لالبرمجية التالية:

#include <boost/noncopyable.hpp>

enum Error { ERR_OK=0 };

struct Filter : private boost::noncopyable
{
  Filter() {}
  virtual ~Filter() {}

  virtual int filter(int* data) const = 0;

};

struct  SpecialFilter : public Filter, private boost::noncopyable
{
  inline SpecialFilter(unsigned int min, unsigned int max) : min(min), max(max) {}
  virtual ~SpecialFilter() {}

  virtual int filter(int* data) const
  {
    // ...
    return ERR_OK;
  }

  unsigned int min;
  unsigned int max;
};

struct AClass
{
  AClass() {}
  AClass(const AClass& other) {}
  ~AClass() {}

  int specialFilter(int channel, int minThreshold, int maxThreshold)
  {
    // ...
    return filter(channel, SpecialFilter(123, 321));
  }

  int filter(int channel, const Filter& filter)
  {
    // ...
    return ERR_OK;
  }

};

وبلدي مترجم (GCC 4.2) يشكو:

- warning: direct base ‘boost::noncopyable_::noncopyable’ inaccessible in ‘SpecialFilter’ due to ambiguity
- noncopyable.hpp: In copy constructor ‘Filter::Filter(const Filter&)’:
- noncopyable.hpp:27: error: ‘boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable&)’ is private
- synthezised method first required here: [return filter(channel, SpecialFilter(123, 321));]

ولكن أنا لا استدعاء منشئ نسخة!

هل كانت مفيدة؟

المحلول

وأنت لا يدعون نسخة منشئ. ويطلق على منشئ نسخة دائما بالنسبة لك ضمنيا من قبل المجمع. لذا عليك أن تتعلم أن تعرف الحالات عندما يمكن أن يطلق عليه.

عند إرفاق إشارة CONST إلى كائن مؤقت

...
return filter(channel, SpecialFilter(123, 321));
...

والمترجم له الحق في إجراء نسخة من كائن مؤقت ويحتاج إلى نسخة منشئ الوصول إليها (حتى لو كان لا سوف يطلق في الواقع). وهذا ما يسبب المشكلة في حالتك.

وبعبارة أخرى، عند إجراء نوع غير copyable، أنت أيضا التخلي عن إمكانية إرفاق المراجع CONST إلى كائنات مؤقتة من هذا النوع.

نصائح أخرى

أولا، وإزالة الاشتقاق الخاص من SpecialFilter - أنه ليس من الضروري، وتصفية بالفعل لا copyable. مشاكل مثل هذه هي السبب في أنني أعتقد أن الحلول مثل دفعة :: non_copyable هي فكرة سيئة - هناك طرق أبسط من أن تقول أنك لا تريد نسخ

.

وثانيا، على الرغم من أنني لست متأكد من أن هذا هو المشكلة، ويقول C ++ أن منشئ نسخة العام يجب أن يكون متاحا للمترجم تحت عدة circimstances، <م> حتى إذا لم المترجم استخدام فعلا .

وأتذكر عندما كنت تمرير الكائن وعودة وجوه من حيث القيمة -> نسخ منشئ يتم استدعاء

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top