2013-03-01 4 views
0

Это действительно сводит меня с ума:Eclipse, с ++ 11 // вектор

#include <iostream> 
#include <vector> 
#include <string.h> 
#include <thread> 

using namespace std; 

void test() { 
    vector<string> myvector; 
    string a("Teststring"); 
    myvector.push_back(a); 
    cout << myvector.begin()->length() << endl; 
} 

int main() { 
    thread(test).join(); 
    return 0; 
} 

Код компилируется нормально с -std = C++ 11 флагов для компилятора и -pthread флага компоновщика ,

НО: Затмение делает либо знает зЬй :: бечевки или myvector.begin() -> длина(), даже если код работает нормально затмение предупреждает меня «„длина“метод не может быть решен».

Я пробовал все возможные решения здесь: Eclipse CDT C++11/C++0x support без каких-либо успехов. Это заняло у меня столько часов, что я делаю неправильно ?!

Есть ли у кого-нибудь проблемы с проектом, без проблем с этим кодом?

EDIT: Другой пример кода - та же проблема:

#include <iostream> 
#include <vector> 
#include <thread> 


using namespace std; 

class TestClass { 
public: 
    void test() { 
     cout << "test" << endl; 
    } 
}; 

void test() { 
    vector<TestClass> testClassVector; 
    TestClass x; 
    testClassVector.push_back(x); 
    testClassVector.begin()->test(); 
} 

int main() { 
    thread(test).join(); 

    return 0; 
} 

компилируется и работает правильно, но возвращается в затмении: метод 'тест' не может быть решена

EDIT:

рабочие варианты:

((TestClass)*(testClassVector.begin())).test(); 

TestClass foo2 = *(testClassVector.begin()); 
    foo2.test(); 

до сих пор не работает:

testClassVector.begin()->test(); 

Последние компилирует и работает как над ними, но затмение по-прежнему утверждает:

метод 'тест' не может быть решена

+1

Try '#include ' – James

+0

Пробовал, не решает проблему. – christian667

ответ

1

Возможно, я ошибаюсь, но я думаю, что ваша проблема не исходит от Eclypse. Juste, begin() на векторе return a std::vector<T>::iterator во-первых, это не указатель, и длина метода отсутствует, но вы можете задать размер вектора с myvector.size();, если это то, что вы хотите. Проблема может возникнуть из вашего #include <string.h>, который не совпадает с #include <string>, string.h предназначен для строковой операции, такой как strcmp, strstr и т. Д. Строка juste будет определять объект std :: string.

+0

Я думаю, что точка печатает длину строки длиной 10 символов. – Joel

+0

О да, извините, мне плохо. Таким образом, проблема должна исходить из строки string.h в отношении строки juste. Я редактирую его. – Hulor

+0

Как описано здесь: http://www.mochima.com/tutorials/vectors.html, вы можете получить доступ к методам с помощью этого указателя. Или есть ли другие способы сделать это? – christian667

0

У меня нет Eclipse, но проблема, похоже, около std::string. Устранена ли проблема, если вы удалите поток из примера? (Я также изменил в #include <string> вместо string.h)

#include <iostream> 
#include <vector> 
#include <string> 
#include <thread> 

using namespace std; 

#if 0 
void test() { 
    vector<string> myvector; 
    string a("Teststring"); 
    myvector.push_back(a); 
    cout << myvector.begin()->length() << endl; 
} 
#endif 

int main() { 
    //thread(test).join(); 
    vector<string> myvector; 
    string a("Teststring"); 
    myvector.push_back(a); 
    cout << myvector.begin()->length() << endl; 
    return 0; 
} 

Это следует надеяться распечатать 10.

Обновление от комментариев:

это генерировать ли предупреждение для Eclipse?

auto tmp = *(myvector.begin()); 
std::cout << tmp.length() << std::endl; 

Как насчет этого?

std::string foo("abc123"); 
std::cout << foo.length() << std::endl; 

Я тоже думаю, еще один:

std::string foo2 = *(myvector.begin()); 
std::cout << foo2.length() << std::endl; 
+0

Он распечатывает 10, но ошибка в eclipse остается прежней: ** Метод «длина» не может быть разрешен ** – christian667

+0

Я обновил ответ еще на несколько тестов. – Joel

+0

Первый заканчивается с той же ошибкой. Второй работает (вы пропустили: после первого std) и дали мне длину этой строки. – christian667

0

Решение было найдено:

Я скачал затмение Kepler Kepler

создал новый проект и попытался скомпилировать этот исходный код (например, выше):

#include <iostream> 
#include <vector> 
#include <thread> 

using namespace std; 

class TestClass { 
public: 
    void test() { 
     cout << "test" << endl; 
    } 
}; 

void test() { 
    vector<TestClass> testClassVector; 
    TestClass x; 
    testClassVector.push_back(x); 
    testClassVector.begin()->test(); 
} 

int main() { 
    thread(test).join(); 
    return 0; 
} 

На первом запуске eclipse сказал мне, что поток принадлежит к новому стандарту C++ 11, и я должен добавить -std = C++ 11 к флагам компилятора. Чтобы использовать поток, я также добавил -pthread к флагам компоновщика. С помощью этих шагов код может быть скомпилирован, но eclipse отмечает поток еще как неизвестный. Чтобы исправить это, я сделал следующий шаг:

В разделе C/C++ Build (в настройках проекта) найдите Preprocessor Include Path и перейдите на вкладку «Провайдеры». Отмените выбор всех, кроме настроек компилятора CDT GCC. Затем отмените ссылку на настройки параметров .... Добавьте параметр -std = C++ 11 в текстовое поле Command, чтобы получить спецификации компилятора.

Найдено here.

Теперь - невероятно, но верно - он работает, даже без ошибок, отмеченных eclipse. Решение использует (бета) версию eclipse, которая, похоже, лучше справляется с этим.

Спасибо за вашу помощь!

Смежные вопросы