Chciałbym mieć domyślny funktor dla parametru functor w konstruktorze klasy. Jako minimalny przykład wymyśliłem klasę, która powinna służyć jako filtr, który filtruje elementy typu T
iif funkcja filtru zwraca true. Funkcja Filtr powinien być dostarczony w konstruktorze, zalegających na „Akceptuj wszystkie” funkcje filtra:Funkcja Lambda jako domyślny argument dla funkcji std :: in Konstruktor
template<class T>
class Filter
{
public:
typedef std::function<bool(const T&)> FilterFunc;
Filter(const FilterFunc & f = [](const T&){ return true; }) :
f(f)
{
}
private:
FilterFunc f;
};
I instancji klasy szablonu tak:
int main() {
Filter<int> someInstance; // No filter function provided (<-- line 19)
}
jednak gcc 4.7 doesn't seem to like this piece of code:
prog.cpp: In constructor ‘Filter<T>::Filter(const FilterFunc&) [with T = int; Filter<T>::FilterFunc = std::function<bool(const int&)>]’:
prog.cpp:19:17: internal compiler error: in tsubst_copy, at cp/pt.c:12141
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.7/README.Bugs> for instructions.
Preprocessed source stored into /home/g9i3n9/cc82xcqE.out file, please attach this to your bugreport.
Co jest nie tak? Czy mój kod jest zgodny ze standardem (więc GCC jest tutaj naprawdę błędny lub nie zaimplementował tego) lub czy robię coś nie tak?
Jako obejście, Używam obecnie domyślnie skonstruowany std::function
i tylko nazwać (gdzie chcę go nazwać), jeśli został ustawiony:
Filter(const FilterFunc & f = FilterFunc) :
f(f)
{
}
// When using it:
void process() {
if (!f || f(someItem)) { // <-- workaround
}
}
Wydaje się błąd. Ponad 4,8 kompiluje dobrze: http://liveworkspace.org/code/TFMDc$0 – SomeWittyUsername
Działa również z Clang 3.2. – ipc
Dziękujemy za testowanie innych kompilatorów. Dodałem obejście tego problemu, które jest dopuszczalne tylko w niektórych przypadkach, takich jak moje, ale mogą istnieć inne przypadki, w których nie można tego użyć. – leemes