#pragma once

#include "jwtxx/jwt.h"

#include <string>

namespace JWTXX
{

struct Key::Impl
{
    // Need this for polymorphic behavior.
    virtual ~Impl() = default;
    // Need this due to the Rule of Five.
    Impl() = default;
    Impl(const Impl&) = delete;
    Impl& operator=(const Impl&) = delete;
    Impl(Impl&&) = default;
    Impl& operator=(Impl&&) = default;

    virtual std::string sign(const void* data, size_t size) const = 0;
    virtual bool verify(const void* data, size_t size, const std::string& signature) const = 0;
};

}

#pragma once

#include "jwtxx/jwt.h"

#include <string>

namespace JWTXX
{

struct Key::Impl
{
    virtual ~Impl() {}
    virtual std::string sign(const void* data, size_t size) const = 0;
    virtual bool verify(const void* data, size_t size, const std::string& signature) const = 0;
};

}

--- 
+++ 
@@ -9,7 +9,15 @@
 
 struct Key::Impl
 {
-    virtual ~Impl() {}
+    // Need this for polymorphic behavior.
+    virtual ~Impl() = default;
+    // Need this due to the Rule of Five.
+    Impl() = default;
+    Impl(const Impl&) = delete;
+    Impl& operator=(const Impl&) = delete;
+    Impl(Impl&&) = default;
+    Impl& operator=(Impl&&) = default;
+
     virtual std::string sign(const void* data, size_t size) const = 0;
     virtual bool verify(const void* data, size_t size, const std::string& signature) const = 0;
 };
Enable move and disable copy for key implementations.
