0

这真的让我发疯:

#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 标志正常编译。

但是:Eclipse 确实知道 std::thread 或 myvector.begin()->length(),即使代码运行良好 eclipse 也会警告我"Method 'length' could not be resolved"

我在这里尝试了所有可能的解决方案:Eclipse CDT C++11/C++0x support,但没有成功。这花了我这么多小时,我做错了什么?!

有没有人在这个代码没有问题的情况下进行项目设置?

编辑:其他代码示例 - 同样的问题:

#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 中返回:无法解析方法“测试”

编辑:

工作版本:

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

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

还是行不通:

testClassVector.begin()->test();

最后一个编译并像上面两个一样工作,但 eclipse 仍然声称:

方法“测试”无法解决

4

3 回答 3

1

也许我错了,但我认为你的问题不是来自 Eclypse。Juste,向量上的 begin() 返回std::vector<T>::iterator第一个,这不是指针,也没有方法长度,但myvector.size();如果这是你想要的,你可以询问向量的大小。问题可能来自于您#include <string.h>的不同#include <string>,string.h 用于字符串操作,如 strcmp、strstr 等...... juste string 将定义 std::string 对象。

于 2013-03-01T01:45:46.967 回答
0

找到的解决方案:

我下载了eclipse开普勒开普勒

创建了一个新项目并尝试编译此源代码(如上):

#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 并转到 Providers 选项卡。取消选择除 CDT GCC Builtin Compiler Settings 之外的所有选项。然后取消标记共享设置条目...。将选项 -std=c++11 添加到名为 Command 的文本框中以获取编译器规范。

在这里找到。

现在 - 令人难以置信但真实 - 它可以工作,即使没有任何 eclipse 标记的错误。解决方案是使用 eclipse 的(测试版)版本,它似乎以更好的方式处理这个问题。

感谢你的帮助!

于 2013-03-01T22:54:35.637 回答
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;
于 2013-03-01T02:12:18.910 回答