Zamierzam użyć shared_ptr
sporo w nadchodzącym projekcie, więc (nie zdając sobie z std::make_shared
) Chciałem napisać o zmiennej liczbie argumentów funkcji szablonu spnew<T>(...)
jako shared_ptr
-returning stand-in dla new
. Wszystko poszło gładko, dopóki nie spróbowałem użyć typu, którego konstruktor zawiera initializer_list
. Otrzymuję następujący z GCC 4.5.2, gdy próbuję skompilować minimalny przykład poniżej:Rozszerzenie parametru pakiet zawierający initializer_list konstruktorowi
In function 'int main(int, char**)': too many arguments to function 'std::shared_ptr spnew(Args ...) [with T = Example, Args = {}]' In function 'std::shared_ptr spnew(Args ...) [with T = Example, Args = {}]': no matching function for call to 'Example::Example()'
Co dziwne, mam równoważne błędy gdybym zastąpił std::make_shared
dla spnew
. W obu przypadkach wydaje się, że nieprawidłowo wyprowadza się parametry, gdy w grę wchodzi initializer_list
, błędnie traktując Args...
jako puste. Oto przykład:
#include <memory>
#include <string>
#include <vector>
struct Example {
// This constructor plays nice.
Example(const char* t, const char* c) :
title(t), contents(1, c) {}
// This one does not.
Example(const char* t, std::initializer_list<const char*> c) :
title(t), contents(c.begin(), c.end()) {}
std::string title;
std::vector<std::string> contents;
};
// This ought to be trivial.
template<class T, class... Args>
std::shared_ptr<T> spnew(Args... args) {
return std::shared_ptr<T>(new T(args...));
}
// And here are the test cases, which don't interfere with one another.
int main(int argc, char** argv) {
auto succeeds = spnew<Example>("foo", "bar");
auto fails = spnew<Example>("foo", {"bar"});
}
Czy to tylko niedopatrzenie z mojej strony, czy błąd?
Jest "std :: make_shared", nawiasem mówiąc. – GManNickG
@GMan: Tak, znalazłem to i będę z niego korzystał, ale nadal jestem ciekawy co napisałem. –
@GMan: Właściwie, spróbujmy zastąpić 'make_shared' dla' spnew' w moim przykładzie, nadal nie działa w przypadku 'fail' z odpowiednimi błędami. Teraz przynajmniej wiem, gdzie błąd nie jest ... –