derlemek için türetilmiş bir sınıf adını eşdeğer bir sınıfla değiştirme başarısız oluyor Yinelenen ve bir işlevi kabul eden bir şablonlu işlev oluşturmaya çalışıyorum, böylece geçirilen işlev dolaylı olarak bir std::function
Uygun tipte (böylece hem tam fonksiyonlarla hem de lambdalarla kullanılmasına izin verir).(g ++ 4.7.1)
#include <iostream>
#include <vector>
#include <algorithm>
#include <typeinfo>
template<typename T>
void bar(const T & base, std::function<bool(int)> f) // works
//void bar(const T & base, std::function<bool(typename T::iterator::value_type)> f) // fails to compile
{
std::cout << ((typeid(std::function<bool(int)>) == typeid(std::function<bool(typename T::iterator::value_type)>))?"identical":"distinct") << std::endl;
}
bool filter(int x) { return x%2==0; }
int main() { bar(std::vector<int> {0, 1}, filter); }
bu identical
üretir g++-4.7 -std=c++11 -o itest itest.cpp
ile Derleyen:
İşte kod. Eğer yorumsuz hat 10 ve yorum hattı 9 ve yukarıdaki gibi derlemek
yerine derleme ben değiştirilmemiş sürümü Xcode (uygun seçenekleri ayarladıktan) ile başarılı belirtmeliyiz
g++-4.7 -std=c++11 -Wall -Werror -o itest itest.cpp
itest.cpp: In function 'int main()':
itest.cpp:16:53: error: no matching function for call to 'bar(std::vector<int>, bool (&)(int))'
itest.cpp:16:53: note: candidate is:
itest.cpp:9:10: note: template<class T> void bar(const T&, std::function<bool(typename T::iterator::value_type)>)
itest.cpp:9:10: note: template argument deduction/substitution failed:
itest.cpp:16:53: note: mismatched types 'std::function<bool(typename T::iterator::value_type)>' and 'bool (*)(int)'
ile başarısız ama ben d Mümkünse g ++ ile yapışmayı tercih edin. Yanlış bir şey mi yapıyorum yoksa g ++ olarak bilinen bir hata mı?
Huh, teşekkürler. Bir başka (daha da korkunç) geçici bir çözüm geliştirdim, biri arayanın ikinci türden bahsetmesini veya türetmesini gerektirmiyordu. – Bakkot
Oops, [link] 'i (https://gist.github.com/a172651b93dc4670f295) unuttu. Her ikisini de okumak istemeyen insanlar için, aslında bu bir şeydir. – Bakkot