以下代碼C++與雙打
#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}); }
被編譯可變參數模板(具有6.3 GCC,在Debian/SID/x86-64的)正確地,我期望它對於像
auto vec = make_from_ints(1,2,3);
呼叫
的指針返回到含有1,2的整數的一些載體中,3.
然而,如果我通過double
替換int
,即如果我添加以下(在同一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++
不要更改任何東西。
'整形變量...'被解析爲'整形變量,... ',你的模板的定義是錯誤的 –