1

我无法让智能感知自动完成 boost 1.40.0 的共享指针。(它适用于 Boost 1.33.1。)这是一个简单的示例项目文件,其中自动完成不起作用:

#include <boost/shared_ptr.hpp>

struct foo
{ bool func() { return true; }; };

void bar() {
    boost::shared_ptr<foo> pfoo;
    pfoo.get();      // <-- intellisense does not autocomplete after "pfoo."
    pfoo->func();    // <-- intellisense does not autocomplete after "pfoo->"
}

当我右键单击 shared_ptr 并执行“转到定义”时,它会将我带到<boost/exception/exception.hpp>. 它并没有让我想到实际的定义,即<boost/smart_ptr/shared_ptr.hpp>. 但是,它编译得很好,并且自动完成对“boost::”工作得很好。此外,自动完成对于 boost::scoped_ptr 和 boost::shared_array 也很有效。

有任何想法吗?

4

3 回答 3

4

Intellisense 有自己的编译器,可以容忍代码错误(它必须能够理解不完整的代码),但有时根本无法正确解析正确的代码。后者对于要求苛刻的模板代码尤其如此(因为 boost 是臭名昭著的)。

要么接受它,要么等到 Intellisense 使用“普通”编译器(是为 VC10 或之后的版本宣布的?),或者尝试Visual Assist的最新版本是否更好。

于 2010-04-05T20:21:29.027 回答
3

我最近也遇到了这个并去寻找答案。我只发现有人说 Intellisense 将在 VC10 中得到改进,或者我现在应该使用 Visual Assist 改进它。我不喜欢这些答案,所以我做了一些实验。这是解决大多数问题的解决方案(至少它解决了 shared_ptr 的 scoped_ptr 没有的问题)。

解决方案:

在 exception.hpp 中更改 Intellisense 跳转到的前向声明以包含模板参数名称 T。

改变

template <class>
class shared_ptr;

template <class T>
class shared_ptr;

似乎 Intellisense 认为没有模板参数名称的定义是一个单独的类,这是 shared_ptr 和 scoped_ptr 之间差异的根源。

现在,我提到这并没有解决我所有的问题。有时在头文件中声明的模板化对象不会在 cpp 文件中保留模板类型。

前任。

// file.h
#include <boost/shared_ptr.hpp>

struct foo
{
    void funcA() {}
};

struct bar
{
    void funcB();
    boost::shared_ptr<foo> pfoo;
};

然后在cpp文件中

// file.cpp
#include "file.h"

void bar::funcB()
{
    pfoo.get();      // <-- intellisense does autocomplete after "pfoo."
    pfoo->func();    // <-- intellisense does not autocomplete after "pfoo->"
}

无论如何,这是我们仍然存在的问题的未经测试的精简示例,但这种情况远不常见,因此我们可以忍受它,直到 Intellisense 改进。

于 2010-04-15T19:01:34.173 回答
1

值得一提的是,VC++ 2010为 Intellisense 提供了一个单独的 (EDG) 编译器。您是否尝试过 VS2010 的 Boost 1.40?

于 2010-04-05T21:43:57.573 回答