2011-12-13 19 views
5

Yapıların vektöründe bir öğe bulmaya çalışıyorum. Kod, büyük/küçük harfe duyarlı bir şekilde arama yaparken çalışır. Büyük/küçük harf duyarlı olmak için geliştirmeye çalıştığımda, iki konuya giriyorum.Yükseltme phoenix'i kullanarak, find_with'i start_with ile nasıl çağırabilirim?

  1. Daha önce çalışan VS2010 yapısını boost/algorithm/string.hpp keser. Hata "'boost :: phoenix :: bind': aşırı yüklü işleve belirsiz çağrı". Xcode'ta tamam. Bağları ayırmak için herhangi bir yol var mı?

  2. Sanırım istarts_with çağrısı ekleyerek ikinci (yorumla) find_if satırında yanlış sözdizimi var. "Hata:" tip '"adlı bir tür yok" diyerek phoenix başlıkları hataları alıyorum. Sorun # 1'in düzeltilebileceğini varsayarak, bu satırı nasıl düzeltmeliyim?

teşekkürler!

Kodu:

#include <iostream> 
#include <algorithm> 
#include <string> 
#include <vector> 
#include <boost/algorithm/string.hpp> // This include breaks VS2010! 
#include <boost/phoenix/bind.hpp> 
#include <boost/phoenix/core.hpp> 
#include <boost/phoenix/operator.hpp> 
#include <boost/phoenix/stl/algorithm.hpp> 
using namespace boost::phoenix; 
using boost::phoenix::arg_names::arg1; 
using boost::istarts_with; 
using std::string; 
using std::cout; 

// Some simple struct I'll build a vector out of 
struct Person 
{ 
    string FirstName; 
    string LastName; 
    Person(string const& f, string const& l) : FirstName(f), LastName(l) {} 
}; 

int main() 
{ 
    // Vector to search 
    std::vector<Person> people; 
    std::vector<Person>::iterator dude; 

    // Test data 
    people.push_back(Person("Fred", "Smith")); 

    // Works! 
    dude = std::find_if(people.begin(), people.end(), bind(&Person::FirstName, arg1) == "Fred"); 
    // Won't build - how can I do this case-insensitively? 
    //dude = std::find_if(people.begin(), people.end(), istarts_with(bind(&Person::FirstName, arg1), "Fred")); 

    if (dude != people.end()) 
     cout << dude->LastName; 
    else 
     cout << "Not found"; 
    return 0; 
} 
+0

Hangi Boost sürümünü kullanıyorsunuz? – MDman

+0

Yükseltmeyi Kullanma 1.48.0. –

cevap

2

Bunu çalışması için iki bağlamalar gerekiyordu.

int istw(string a, string b) { return istarts_with(a,b); } 

ve sonra find_if için yüklem olarak aşağıdaki kullanın: İlk tanımlamak

bind(&istw,bind(&Person::FirstName, arg1),"fred") 

İki yorumlarınızı: Eğer hakkına bind kullandığınızdan emin olun

  1. , yani boost::phoenix::bind kullanın.
  2. istw'un tanımı büyük olasılıkla gereksizdir ancak değiştirmenin doğru yolunu bulamadım.
+0

Istarts_iwith ile ayrı bir işleve taşınmayı denemedim ve bu gerçekten de hile yapıyor. Teşekkürler! –

+0

VS2010 ile derlenmemesi sorunu hala mevcut, ancak şimdi istw/algoritm/string.hpp içeren ayrı bir dosyaya taşıyabilir ve bu dosyayı phoenix dahil bırakabilirim. –

+0

Sadece "bind" kullanmak yerine "boost :: phoenix :: bind" (hiç bir anlam ayrıntısına ihtiyaç duymaz) özelliğini açıkça kullanırsanız derleyebilirsiniz. – MDman

İlgili konular