【问题标题】:Eclipse polymorphism using C++11 shared_ptr errorEclipse 多态性使用 C++11 shared_ptr 错误
【发布时间】:2012-12-04 00:35:51
【问题描述】:

给出以下示例代码:

#include <iostream>
#include <memory>
using namespace std;

struct A {
public:
    A(int aa) : a(aa) {}
    int a;
    virtual ~A() {}
};
struct B : A {
public:
    B(int aa, int bb) : A(aa), b(bb) {}
    int b;
};

void f(shared_ptr<A> a){
    shared_ptr<B> b = dynamic_pointer_cast<B>(a);
    if (b) {
        cout << b->b << endl;
    } else {
        cout << a->a << endl;
    }
}

int main() {
    auto a = make_shared<A>(3);
    auto b = make_shared<B>(7, 4);
    f(a);
    f(b);
    return 0;
}

Eclipse 提示在线有错误

f(b);

Invalid arguments ' Candidates are: void f(std::shared_ptr&lt;A&gt;) '
因为 shared_ptr&lt;B&gt; 已通过。这编译并运行,并有输出:

3
4

正如预期的那样。

索引器和编译器已指定 -std=c++11。
编译器还定义了符号__GXX_EXPERIMENTAL_CXX0X__

有什么办法可以在 Eclipse 中消除这个错误及其红色曲线(最好不修改源代码)?

【问题讨论】:

    标签: c++ eclipse c++11 polymorphism smart-pointers


    【解决方案1】:

    这已在更高版本的 CDT 中得到修复(我刚刚尝试过)。

    您可以使用此存储库来使用 CDT 的夜间构建: 前往帮助,输入网址http://download.eclipse.org/tools/cdt/builds/kepler/nightly

    如果您不想使用夜间构建,您至少应该使用http://download.eclipse.org/tools/cdt/releases/juno/确保您拥有最新发布的版本(在撰写本文时它是 8.1.1)

    在这里可以找到我使用 C++11 的完整 Eclipse 设置: http://scrupulousabstractions.tumblr.com/post/36441490955/eclipse-mingw-builds

    【讨论】:

    • 哇,很高兴听到这个消息。我今天一回家就试一试。
    【解决方案2】:

    我建议你在它可能还不支持 C++11 的设置中禁用静态代码分析插件 Codan。

    【讨论】:

    • 严格来说,这确实解决了问题,但是当我实际上给函数提供了无效参数时,我实际上喜欢有红色的波浪线。
    • Codan 的问题在于它提供了太多的误报。您当然可以检查是否有特定的检查程序给您带来问题并禁用它。
    • 是的,这就是我现在要做的,而不是更好的解决方案。感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2020-12-06
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    相关资源
    最近更新 更多