Ошибка вызова частного конструктора в macos - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь портировать некоторый код C ++, который кодирует данные в base64, в macos.Это пример кода из того же источника, который компилируется и выполняется на Godbolt, но не на моем Mac:

#include <vector>
#include <string>

#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#include <boost/archive/iterators/insert_linebreaks.hpp>

using namespace boost::archive::iterators;

struct Encode
{
    /// Sets the contents of an std::string to be used
    /// as the input for the encoding operation.
    /// \param a_Data The string to encode.
    Encode(const std::string& a_Data);

    /// Evaluates the expression and performs the base64 encoding.
    /// \returns Base64 encoded string.
    operator std::string() const;
private:
    std::string Evaluate() const;

    const char * m_Data;
    size_t m_Size;
    bool m_LineBreaks;
};

Encode::Encode(const std::string& a_Data)
    : m_Data(a_Data.c_str())
    , m_Size(a_Data.size())
    , m_LineBreaks(false)
{
}

std::string Encode::Evaluate() const
{
    typedef base64_from_binary<
            transform_width<std::string::const_iterator,6,8>
        > iterator;

    typedef insert_linebreaks<iterator, 72> linebreak_iterator;

    std::string base64;
    if (m_LineBreaks) {
        base64.assign(
            linebreak_iterator(m_Data),
            linebreak_iterator(m_Data + m_Size));
    }
    else {
        base64.assign(
            iterator(m_Data),
            iterator(m_Data + m_Size));
    }

    return base64;
}
Encode::operator std::string() const
{
    return Evaluate();
}

int main()
{
    const std::string str64 = Encode("Hello World");    
    return 0;
}

Я компилирую с использованием g ++:

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.2)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

Однако, естьследующая ошибка в строке iterator(m_Data),:

boost/archive/iterators/transform_width.hpp:112:17: error: calling a private constructor of class 'std::__1::__wrap_iter<const char *>'
        super_t(Base(static_cast< T >(start))),
                ^
<build_path>/boost/archive/iterators/base64_from_binary.hpp:91:13: note: in instantiation of function template specialization 'boost::archive::iterators::transform_width<std::__1::__wrap_iter<const char *>, 6, 8,
      char>::transform_width<const char *>' requested here
            Base(static_cast< T >(start)),
            ^
<src_path>/utilsBase64.cc:105:13: note: in instantiation of function template specialization 'boost::archive::iterators::base64_from_binary<boost::archive::iterators::transform_width<std::__1::__wrap_iter<const char *>, 6, 8, char>, char>::base64_from_binary<const
      char *>' requested here
            iterator(m_Data),
            ^
/Library/Developer/CommandLineTools/usr/include/c++/v1/iterator:1420:31: note: declared private here
    _LIBCPP_INLINE_VISIBILITY __wrap_iter(iterator_type __x) _NOEXCEPT_DEBUG : __i(__x) {}
                              ^

Я попытался использовать clang ++ и попытался установить -stdlib=libc++ или stdlib=libstdc++ с похожим результатом.Все примеры использования base64_from_binary, показанные в коде, аналогичны приведенному примеру кода.

Еще одна деталь о m_Data, это переменная-член, объявленная как: const char * m_Data;

Может кто-нибудь объяснить, как это можно решить?

1 Ответ

0 голосов
/ 11 октября 2018

Изменение кода на следующее помогло решить проблему:

std::string Encode::Evaluate() const
{
    typedef base64_from_binary<
            transform_width<std::string::const_iterator,6,8>
        > iterator;

    typedef insert_linebreaks<iterator, 72> linebreak_iterator;

    std::string data(m_Data, m_Size);
    std::string base64;
    if (m_LineBreaks) {
        base64.assign(
            linebreak_iterator(data.begin()),
            linebreak_iterator(data.end()));
    }
    else {
        base64.assign(
            iterator(data.begin()),
            iterator(data.end()));
    }

    return base64;
}
...