c++ - c++朋友模板函数错误
问题描述
我可以使用 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]' 受保护
解决方案
看起来像 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;
}
推荐阅读
- r - 如何加快 grepl 函数的执行速度?
- android - 使用 MaterialDesignComponents 在 RecyclerView Scroll 上隐藏 AppBarLayout
- c++ - 条件类模板构造函数
- sql - 如何连接包裹在'字符周围的字符串
- powershell - 如何组合字符串输入并动态生成数组?
- linux - 确定 Nemo 上下文菜单操作顺序
- spring-boot - 如何实时更新数据
- java - 如何弄清楚 model.getName() 指向 Firebase 中的内容
- php - 如果 index.php 不在 URL 中,则在所需文件中使用 URI 嵌入图像的服务器错误
- java - 查找字符串中的模式计数(包括重叠)