【发布时间】:2017-08-28 01:47:21
【问题描述】:
以下代码
#include <initializer_list>
#include <vector>
template<int ...>
const std::vector<int>*make_from_ints(int args...)
{ return new std::vector<int>(std::initializer_list<int>{args}); }
正在正确编译(使用 GCC 6.3,在 Debian/Sid/x86-64 上),我希望它能像这样的调用
auto vec = make_from_ints(1,2,3);
返回一个指向包含 1、2、3 的整数向量的指针。
但是,如果我将int 替换为double,那就是如果我添加以下(在同一个basiletemplates.cc 文件中...)代码:
template<double ...>
const std::vector<double>*make_from_doubles(double args...)
{ return new std::vector<double>(std::initializer_list<double>{args}); }
我收到一个编译错误:
basiletemplates.cc:8:17: error: ‘double’ is not a valid type
for a template non-type parameter
template<double ...>
^~~
我不明白为什么。毕竟int 和double 都是标量数字 POD 类型(在 C++11 标准中预定义)。
如何获取模板可变参数函数以便能够编码:
auto dvec = make_from_doubles(-1.0, 2.0, 4.0);
并获得指向包含 -1.0, 2.0, 4.0 的一些双精度向量的指针?
顺便说一句,为 C++14 编译(使用 g++ -Wall -std=c++14 -c basiletemplates.cc),并使用 clang++(版本 3.8.1)而不是 g++ 不会改变任何东西。
【问题讨论】:
-
int args...被解析为int args, ...,你的模板定义完全错误
标签: c++ c++11 variadic-templates