相关疑难解决方法(0)

使用模板化运算符删除时出现虚拟析构函数问题

以下类(带有虚拟析构函数)包含模板化的operator delete

\n
struct S\n{\n    virtual ~S() {}\n    template <typename... Args>\n    void operator delete(void* ptr, Args... args);\n};\n
Run Code Online (Sandbox Code Playgroud)\n

args可以为空,所以我认为S::operator delete也可以在预期常规时使用delete

\n

但是(使用 g++),我收到错误\xef\xbc\x9a

\n
\n

错误:“S”没有合适的“操作符删除”

\n
\n

难道“合适的‘操作删除’”就不能成为一个模板吗?

\n

c++ delete-operator virtual-destructor

10
推荐指数
1
解决办法
382
查看次数

为什么即使我有未定义的成员函数,下面的代码也会编译?

我正在处理这段代码,并认为在点击构建按钮之前显然不会编译.我很惊讶它不仅编译,而且链接和工作.

如果我猜我会说SFINAE负责编译......是吗?

struct BaseClass
{
public:
  BaseClass() {}

  template<typename T>
  BaseClass(const T& a_other)
  {
    int i = 0; // for break point
  }

  template<typename T>
  BaseClass& operator= (const T& a_other)
  {
    int i = 0; // for break point
    return *this;
  }

private:

  BaseClass(const BaseClass& a_other); // Does not have a definition
  BaseClass& operator= (const BaseClass& a_other); // Does not have a definition

};

struct MyClass : public BaseClass
{
};

int main()
{
  MyClass i, j;
  i …
Run Code Online (Sandbox Code Playgroud)

c++ sfinae

8
推荐指数
1
解决办法
658
查看次数

使用模板化构造函数时禁用默认复制构造函数和分配构造函数

我正在尝试创建一个可复制的类,具体取决于其模板参数(bool Copyable),否则它只能移动。

myclass(myclass&&)myclass(myclass const&)通过模板参数启用时,它应该可以从类型本身(默认构造函数)构造bool Copyable

它还可以myclass使用其他模板参数进行构造,我当前的实现通过模板化构造函数和赋值运算符涵盖了这一点。

这里使用零规则通过继承的copyable辅助结构生成默认构造函数和赋值运算符,当为 false 时,该结构将禁用复制构造函数和复制赋值运算符bool Copyable

template<bool>
struct copyable { };

template <>
struct copyable<false>
{
    // Disables copy construct & copy assign
    copyable() = default;
    copyable(copyable const&) = delete;
    copyable(copyable&&) = default;
    copyable& operator=(copyable const&) = delete;
    copyable& operator=(copyable&&) = default;
};

template<typename A, typename B, typename C>
struct storage_t
{
    // Implementation depends on A, B and C
};

template<typename A, typename B, …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++14

5
推荐指数
1
解决办法
990
查看次数

为什么模板复制构造函数会覆盖默认的复制构造函数?

编辑更新的代码:

class Any
{
public:
    Any()
    {
    }

    Any(const Any &other)
    {

    }

    Any(Any &other) // added per Ben's answer
    {
    }

    Any(Any &&other)
    {
    }

    Any(const char *value)
    {
    }

    template<typename T>
    Any(const T &value)
    {
    }

    template<typename T>
    Any(T &&value)
    {
        cout << "move ctor" << endl;
    }

    template<typename T>
    Any(const vector<T> &value)
    {
    }

    template<typename T>
    Any(vector<T> &&value)
    {
    }
};

int main(int argc, char *argv[])
{
    vector<string> numbers;
    numbers.push_back("one");
    numbers.push_back("two");
    numbers.push_back("three");
    numbers.push_back("four");

    Any anyNumbers(numbers);
    Any …
Run Code Online (Sandbox Code Playgroud)

c++ templates

1
推荐指数
1
解决办法
559
查看次数