Der folgende CodeC++ variadische Vorlage mit Doppel
#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}); }
kompiliert (mit GCC 6.3, auf Debian/Sid/x86-64) richtig, und ich erwarte, dass es für einen Anruf wie
auto vec = make_from_ints(1,2,3);
einen Zeiger zu einem gewissen Vektor von ganzen Zahlen zurück, die 1, 2, 3.
wenn jedoch I int
durch double
ersetzen, das heißt, wenn ich die folgenden (in der gleichenhinzuzufügenDatei ...) Code:
template<double ...>
const std::vector<double>*make_from_doubles(double args...)
{ return new std::vector<double>(std::initializer_list<double>{args}); }
ich einen Compiler-Fehler bekommen:
basiletemplates.cc:8:17: error: ‘double’ is not a valid type
for a template non-type parameter
template<double ...>
^~~
und ich verstehe nicht, warum. Schließlich sind sowohl int
als auch double
skalare numerische POD-Typen (im C++ 11-Standard vordefiniert).
Wie eine Vorlage variadische Funktion nutzen zu können, um Code zu erhalten:
auto dvec = make_from_doubles(-1.0, 2.0, 4.0);
und einen Zeiger zu einem gewissen Vektor verdoppelt bekommen enthalten -1,0, 2,0, 4,0?
BTW, kompilieren für C++ 14 (mit g++ -Wall -std=c++14 -c basiletemplates.cc
), und mit clang++
(Version 3.8.1) anstelle von g++
ändern Sie nichts.
'int args ...' als 'int args analysiert wird, ... ', die Definition deiner Vorlage ist einfach falsch –