clang ++ сообщение об ошибке при использовании C ++ 0x: вызов удаленного конструктора - PullRequest
5 голосов
/ 13 октября 2011

Здравствуйте! Я обновил свой 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 работает.

Ответы [ 3 ]

6 голосов
/ 13 октября 2011

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

3 голосов
/ 18 октября 2011

С поддержкой C ++ 0x улучшенные умные указатели определяют конструкторы перемещения.Это, однако, отключает неявное копирование автоматически сгенерированным конструктором копирования и оператором присваивания.

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

1 голос
/ 10 января 2012

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

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;
}
...