错误在"放置新:显式构造"

时间:2018-01-14 13:00:33

标签: c++ string c++11

我关注Stroustroup关于使用隐式联合的例子。

#include <string>
using namespace std;

class MemoryObject {
public:
    enum class t { STRING, BOOLEAN };
    t type;

    MemoryObject& operator=(const MemoryObject& s) {
        if (type == t::STRING && s.type == t::STRING) {
            str = s.str;
            return *this;
        }

        if (type == t::STRING) str.~string();
        type = s.type;

        switch (s.type) {
            case t::BOOLEAN:
                boolean = s.boolean;
                break;
            case t::STRING:
                new(&str){s.str};
                break;
            default:
                break;
        }

        return *this;
    }

private:
    union {
        unsigned long boolean;
        string str;
    };
    t stored;
};

另一方面,我在显式构造的调用上遇到以下错误:

  

/mnt/DEC4763AC47614CD/Progetti/object_converter/MemoryObject.h:30:27:

     

错误:'s'没有命名类型

    new(&str)(s.str);
              ^ /mnt/DEC4763AC47614CD/Progetti/object_converter/MemoryObject.h:30:28:
     

错误:预期')'在'。'标记

之前
    new(&str)(s.str);
               ^

作为一个附带问题,我也想知道为什么我必须明确地使用using namespace std;来调用显式的destroy str.~string();,而另一方面,它可以写既不是str.~std::string();也不是str.std::~string();。我使用以下编译器:g++ (Ubuntu 6.3.0-12ubuntu2) 6.3.0 20170406

0 个答案:

没有答案