为什么默认模板参数不适用于使用声明?
Why don't default-template arguments work on using declarations?
我正试图寻找一个替代以下困境。你知道,当你有一个模板类/函数的默认模板参数,但你将不得不应用尖括号,即使他们是空的?这是我试图解决的问题。我知道我可以使用一个简单的typedef
(typedef X<> L
),但我不想使用不同的名称来引用类。
所以我尝试了以下方法。但由于某些原因,即使我为模板参数提供了类型,它仍然不起作用。为什么呢?
#include <type_traits>
template <typename = void> struct X {};
template <typename T = void>
using L = typename std::conditional<
std::is_void<T>::value,
X<>,
X<T>
>::type;
int main()
{
L l;
}
错误:
prog.cpp: In function ' int main() ':
Prog.cpp:10:7:错误:' l '前缺少模板参数
Prog.cpp:10:7:错误:期望';'在' l '之前
语法与其他类型模板相同:即使对于默认模板,也需要提供空的模板括号:
L<> l;
using
声明实际上是多余的,因为它里面的conditional
什么也不做——你可以把它去掉,得到template <typename T = void> using L = X<T>;
——显然不是你想要的。
事情是这样的:没有别的办法;类型模板与类型不同(原因也很充分!),不能将后者视为前者——必须实例化模板才能获得类型。
相关文章:
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 适用于 WebView2 旧版本的示例应用程序
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- __attribute__(优化(0))) 是否适用于"recursively"?
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 使用一个参数的模板函数时出错(适用于 2)
- 使用 适用于 Android 和 iOS 的 tf-lite C++ API
- 为什么这适用于 G++ 而不是 CLANG?
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- 适用于 Linux 的 c++ 上的代理脚本
- 为什么我的 SFINAE 表达式不再适用于 GCC 8.2?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 模板函数仅适用于VS
- 如何在cmake中包含适用于g++或viceversa的库
- 适用于win32、linux、mac的POSIX C包装器
- 声明适用于 auto,但不能显式声明类型?
- 声明引用适用于类,但不适用于主函数