сообщение об ошибке clang при использовании C 0x: вызов удаленного конструктора

#c #c 11 #clang

#c #c 11 #clang

Вопрос:

Здравствуйте, я обновил свой Xcode до версии 4.2 и clang до версии:

 Apple clang version 3.0 (tags/Apple/clang-211.10.1) (based on LLVM 3.0svn) 
Target: x86_64-apple-darwin11.2.0
Thread model: posix
  

При попытке скомпилировать следующий код с помощью clang -std=c 0x

 #include <memory>
#include <limits>
#include <boost/shared_ptr.hpp>


class ilpConstraintImpl {
public:
    virtual ~ilpConstraintImpl() {}
};


class ilpConstraint {
public:
    ilpConstraint(ilpConstraintImpl* implptr):impl(implptr) { }
public:
    boost::shared_ptr<ilpConstraintImpl> impl;
};

class ilpExprImpl {
public:
    virtual ilpConstraint operator<= (const double rs)=0;
    virtual ~ilpExprImpl() {}
};



class ilpExpr {
 public:
    virtual ~ilpExpr() {};
    ilpConstraint operator<= (const double rs) { return impl->operator<=(rs); }
    ilpExpr(ilpExprImpl* implptr):impl(implptr) { }
    boost::shared_ptr<ilpExprImpl> impl;
};
  

Я получаю следующую ошибку:

 ./test.h:46:54: error: call to deleted constructor of 'ilpConstraint'
    ilpConstraint operator<= (const double rs) { return impl->operator<=(rs); }
                                                        ^~~~~~~~~~~~~~~~~~~~
./test.h:28:7: note: function has been explicitly marked deleted here
class ilpConstraint {
      ^
1 error generated.
  

Компиляция без -std=c 0x работает.

Ответ №1:

Для меня это похоже на ошибку clang. Я работаю с более поздней версией clang, которая не имеет такого поведения. Вы можете попробовать предоставить ilpConstraint явный конструктор копирования в качестве временного обходного пути.

Комментарии:

1. Такого рода работы …. добавление конструктора копирования типа: ilpConstraint(const ilpConstraint amp; impcon):impl(impcon.impl) { } переводит проблему в shared_ptr с тем же сообщением об ошибке 🙂

2. Извините. Вы могли бы попробовать std::shared_ptr из libc . Вы должны выбрать libc в настройках «Стандартная библиотека C » (это не значение по умолчанию).

3. Кажется, я помню, что была проблема с boost shared_ptr, имеющим удаленный конструктор копирования, полагающийся на шаблон конструктора для выполнения копирования и пользующийся поддержкой. Более поздние версии boost исправили эту проблему.

4. Да, проблема в том, что более старые версии shared_ptr объявляют конструкторы перемещения, что заставит clang неявно объявлять и удалять свои конструкторы копирования (как того требует C 11). Более ранние проекты C 11 вообще неявно объявляли конструкторы копирования в таком случае (поэтому использовали шаблон). Это изменение shared_ptr, возможно, может повлиять на ситуацию. Возможно, clang по какой-либо причине неявно объявляет ctor перемещения для ilpConstraint, что означает, что он предоставит только удаленный конструктор копирования для ilpConstraint (поскольку он не может вызвать конструктор копирования shared_ptr).

Ответ №2:

С поддержкой C 0x интеллектуальные указатели boost определяют конструкторы перемещения. Однако это отключает неявное копирование автоматически созданным конструктором копирования и оператором присваивания.

Существует исправление для интеллектуальных указателей boost, которое изменяет конструкторы копирования и операторы присваивания, если обнаружена поддержка C 0x. Его можно найти здесь: https://svn.boost.org/trac/boost/changeset/73202

Ответ №3:

Я столкнулся с той же проблемой, когда у одного из членов моего класса больше не было конструктора по умолчанию.

 struct OrderContact {
    std::string name;
    std::string phone;
    OrderContact() {}  // error without this constructor
    OrderContact(std::string contactName, std::string contactPhone) : name(contactName), phone(contactPhone) {
    }
};

class Order {
public:
    OrderContact contact;
}
  

Комментарии:

1. 1, я столкнулся с этим же сообщением об ошибке сегодня, и это было причиной моего.

2. То же самое, столкнулся с этой проблемой и был исправлен с помощью ctor по умолчанию