нет типа с именем 'type' в 'struct boost :: enable_if' - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь скомпилировать репо в Linux, но у меня есть некоторые проблемы на этом этапе.

* util / BinarySerialization.hpp

template <typename T> inline
typename boost::enable_if<boost::is_pod<T>, void>::type
writeBinary(const T& data, std::ostream& outputStream)
{
    ...
}

template <typename T> inline
typename boost::enable_if<boost::is_pod<T>, void>::type
writeBinary(const std::vector<T>& data, std::ostream& outputStream)
{
    ...
}

template <typename T> inline
typename boost::disable_if<boost::is_pod<T>, void>::type
writeBinary(const std::vector<T>& data, std::ostream& outputStream)
{
    // write vector length
    size_t length = data.size();
    outputStream.write(reinterpret_cast<const char*>(&length), sizeof(length));
    if (!outputStream) throw IOException();
    // write vector data one by one
    for (size_t i = 0; i < length; ++i)
        writeBinary(data[i], outputStream); // error!
}

void writeBinary(const std::string& data, std::ostream& outputStream);

* serialization / ElementBS.cpp

void bil::writeBinary(const Element& data, std::ostream& outputStream)
{
    writeBinary(data.m_name, outputStream);
    writeBinary(data.m_options, outputStream);
}

* xdlrc / model / Element.hpp

typedef std::vector<std::string> ConfigurationOptions;

class Element {
public:
    Element();

    std::string& name();
    const std::string& name() const;
    ConfigurationOptions& options();
    const ConfigurationOptions& options() const;
    void clear();

private:
    friend void writeBinary(const Element& data, std::ostream& outputStream);
    friend void readBinary(Element& data, std::istream& inputStream);

    std::string m_name;
    ConfigurationOptions m_options;

};

util / BinarySerialization.hpp: в экземпляре 'typename boost :: disable_if:: type bil :: writeBinary (const std :: vector &, std :: ostream &) [с T = std :: __ cxx11 :: basic_string ;typename boost :: disable_if:: type = void;std :: ostream = std :: basic_ostream ] ':
serialization / ElementBS.cpp: 16: 45: необходимо отсюда
util / BinarySerialization.hpp: 78: 21: ошибка: нет соответствующей функции длявызов 'writeBinary (const value_type &, std :: ostream &)'
writeBinary (data [i], outputStream);
...
BinarySerialization.hpp: 31: 5: ошибка: тип не указан "введите 'in' struct boost :: enable_if, void> '

Первый writeBinary в ElementBS.cpp совпадает с последней функцией в BinarySerialization.hpp, а вторая функция в ElementBS.cpp совпадает с третьей функцией.Но, writeBinary (data [i], outputStream);в 3-й функции не может соответствовать ни одной функции.Я не знаю, как это исправить;

1 Ответ

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

Чтобы исправить ошибку компилятора, убедитесь, что объявление void writeBinary(const std::string& data, std::ostream& outputStream); предшествует writeBinary шаблонам функций.

Это происходит потому, что во время создания шаблона выполняется вторая фаза поиска зависимого имени, только поиск аргумент-зависимого имени.Так как аргументы writeBinary(const std::string& data, std::ostream& outputStream) поступают из пространства имен std поиск имени, зависящий от аргумента, никогда не находит эту перегрузку, поскольку он не находится в пространстве имен std.

Объявляя эту функцию перед шаблонами функций, которые ее используют, высделайте эту функцию доступной во время первой фазы двухфазного поиска.Затем это имя учитывается во время создания шаблона функции, второй фазы поиска имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...