2010-04-05 1 views
1

У меня возникли проблемы с получением intellisense для автоматического заполнения общих указателей для boost 1.40.0. (Он отлично работает для НЧ 1.33.1.) Вот простой пример файла проекта, где автозаполнения не работает:Intellisense не работает для boost :: shared_ptr с Boost 1.40.0 в Visual Studio 2008

#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 и сделать «Перейти к определению,» это приносит мне для прямого объявления класса shared_ptr в <boost/exception/exception.hpp>. Это не привести меня к фактическому определению, которое находится в <boost/smart_ptr/shared_ptr.hpp>. Тем не менее, он компилируется отлично, и автозаполнение работает отлично для «boost ::.». Кроме того, автозаполнение работает отлично для boost :: scoped_ptr и для boost :: shared_array.

Любые идеи?

ответ

3

Я также недавно столкнулся с этим и пошел искать ответ. Все, что я нашел, это люди, которые говорят, что Intellisense будет улучшено в VC10 или что я должен улучшить его сейчас, используя Visual Assist. Мне не понравился этот ответ, поэтому я немного экспериментировал. Вот решение, которое устраняет большинство проблем (по крайней мере, он исправляет проблемы shared_ptr, которые не имеют scoped_ptr).

РЕШЕНИЕ:

Изменение опережающее объявление, что Intellisense прыгает в exception.hpp включать имя параметра шаблона T.

Изменение

template <class> 
class shared_ptr; 

Для

template <class T> 
class shared_ptr; 

Кажется, что Intellisense рассматривает определение без шаблона pa имя растра, чтобы быть отдельным классом, и это корень различия между shared_ptr и scoped_ptr.

Теперь я упомянул, что это не решило всех моих проблем. Иногда шаблонные объекты, объявленные в файлах заголовков, не сохраняют тип шаблона в файлах cpp.

Ex.

// 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 не улучшается.

+0

Это работает отлично! Спасибо, что следили за этим! –

4

У Intellisense есть свой собственный компилятор, который пропускает ошибки кода (он должен иметь возможность распознать неполный код), но иногда просто не удается правильно разобрать правильный код. Последнее особенно актуально для требовательного кода шаблона (который, как известно, печально известен).

Либо жить с ним, либо ждать, пока Intellisense использует «нормальный» компилятор (было объявлено для VC10 или для версии после этого?), Или попробуйте, если последняя версия Visual Assist лучше.

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