ошибки функции шаблона c ++ - PullRequest
0 голосов
/ 20 февраля 2019

Я могу скомпилировать следующий код с gcc 6.5.Тем не менее, он не может пройти компиляцию gcc 5.5.Может ли кто-нибудь поделиться со мной каким-нибудь обходным решением?

#include <string>
#include <memory>
#include <type_traits>
#include <functional>
#include <utility>
#include <iostream>
#include <experimental/optional>
#include <tuple>

template<typename T>
class Future;
template<typename T, template<typename> class FutureType = Future>
std::shared_ptr<FutureType<T>> MakeReadyFuture(T&& v);

template<typename T>
class Future {
protected:
    template<typename O, template<typename> class FutureType>
    std::shared_ptr<FutureType<O>> friend MakeReadyFuture(O&& v);

    Future(T& v) {}
};

template<typename T, template<typename> class FutureType>
std::shared_ptr<FutureType<T>> MakeReadyFuture(T&& v) {
    return std::shared_ptr<FutureType<T>>(new FutureType<T>(v));
}

int main() {
    MakeReadyFuture(1);
    return 0;
}

Ошибка:

21: 5: ошибка: 'Future :: Future (T &) [with T = int]'защищен

Может быть проверен на https://godbolt.org/z/ZXlHK1

1 Ответ

0 голосов
/ 20 февраля 2019

Похоже на ошибку GCC.Вот мой обходной путь, скомпилированный на GCC 5.5:

#include <string>
#include <memory>
#include <type_traits>
#include <functional>
#include <utility>
#include <iostream>
#include <experimental/optional>
#include <tuple>

template<typename T>
class Future;

struct FutureCreator{
    template<typename T, template<typename> class FutureType = Future>
    static std::shared_ptr<FutureType<T>> MakeReadyFuture(T&& v) {
        return std::shared_ptr<FutureType<T>>(new FutureType<T>(v));
    }
};


template<typename T>
class Future {
protected:
    friend FutureCreator;

    Future(T& v) {}
};


int main() {
    FutureCreator::MakeReadyFuture(1);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...