c++ - 通过引用传递时无法访问转发类型的类型别名
问题描述
我的问题围绕以下代码:
template<typename T>
static void whatever(T&& container) {
typename T::value_type x;
std::cout << x << std::endl;
}
struct something {
using value_type = int;
const char* name;
};
int main() {
whatever(something{}); // passes by rvalue, perfectly fine.
something x;
whatever(x); // deduces the type as something& and complains ::value_type doesn't exist.
return 0;
}
现在,如果我为任何需要引用的方法提供重载。
template<typename T>
static void whatever(T& container);
问题会消失,但我对这两种方法都有完全相同的代码,我想知道是否有一种很好的方法可以将这一切都放在一个方法中。
这只是我为提出问题而提出的示例代码。
解决方案
您必须从推导T
类型中删除引用,例如使用std::decay_t
:
typename std::decay_t<T>::value_type x;
推荐阅读
- excel - 为什么我的 excel 宏不调用外部程序
- c++ - 模拟鼠标悬停在任何 Windows 应用程序的任何 UI 元素上
- google-sheets - 如何在 x 由单元格值确定的列中打印 1 到 x?
- sql-server - 如何从冒号分隔的平面文件中提取 varchar 中的日期时间?
- python - 默认相关名称模式的 Django 设置
- flutter - 即使不应该显示 Flutter SingleChildScrollView 容器也会显示?
- python-3.x - 在 Python3 中如何关闭使用 asynckivy 开始的任务
- android - 在 Room android 的列上使用忽略
- c# - 拖动 WinForm 后如何获取 Windows 窗体在屏幕上的当前位置?
- javascript - Vue Vuetify 性能/冻结问题