2012-11-07 15 views
6

Intellisense đang làm việc rất tồi tệ với VS của tôi ...Intellisense không làm việc với các mẫu VS2012 cuối cùng C++

Khi tôi mã hóa trong C++ nó hoạt động 100% sử dụng tốt, cho đến khi tôi bắt đầu sử dụng các mẫu, sau đó nó chỉ ngừng hoạt động hoàn toàn, dừng phát hiện lỗi và không tự động hoàn tất trong mọi trường hợp.

Tôi có khuynh hướng tin rằng nó có liên quan đến điều tôi đã làm với mã đã phá vỡ nó.

Vì vậy, tôi bắt đầu bằng cách tạo ra một lớp học với một cấu trúc trong đó:

template<typename T> 
class List<T> 
{ 
private: 
    struct Node 
    { 
     T value; 
     Node* next; 
     Node* previous; 
    }; 
    Node* First; 
    Node* Last; 
... 
}; 

sau, tôi tuyên bố một số chức năng bổ sung:

template<typename T> 
inline T List::First() 
{ 
    return First; 
} 

cho đến nay rất tốt, IntelliSense đang làm việc 100% sử dụng tốt , nhưng nếu tôi cố gắng làm đầu tiên-> nó sẽ không hoạt động, VS sẽ không nói cho tôi bất kỳ tùy chọn (ctrl + không gian không hoạt động).

cũng có, nếu tôi gõ một số vô nghĩa nó sẽ không cho tôi biết đó là sai:

sdkjgisjdga->vsrsiib = 123jgi; 

Tôi thật sự không biết phải làm gì để khắc phục điều này.

Cảm ơn bạn đã dành thời gian và nỗ lực của mình.

PS: Tôi đã cố gắng đặt lại cấu hình.

EDIT: Quên để nói rằng nếu tôi không sử dụng mẫu trong tệp .h thì intellisense hoạt động chính xác.

Trả lời

8

Mẫu cần được khởi tạo trước khi bạn có thể nói rõ ràng những gì chúng chứa. Ví dụ: số First-> đoạn mã của bạn là List<T>::Node và điều đó rõ ràng phụ thuộc vào chính xác T.

Chắc chắn, Intellisense trong trường hợp đơn giản này có thể liệt kê rõ ràng các thành viên bằng cách chỉ thay thế T==int trong giây lát. Nhưng hãy xem xét những gì tồi tệ hơn: Intellisense không biết các thành viên (như bây giờ) hoặc Intellisense mis-đoán trong các trường hợp khó khăn, nơi bạn cần nó nhất?

+1

Ok, do đó, nó đang làm việc như inteded và không phải là tôi đã làm điều gì đó sai =) ty cho câu trả lời. Tôi sẽ phải làm quen với nó. –

6

Tôi hơi muộn với câu trả lời này và có thể OP không hoạt động trên mã này nữa, nhưng tôi nghĩ điều này vẫn có thể giúp ai đó đang tìm kiếm mẫu và IntelliSense.

Một điều bạn có thể thử - nếu bạn muốn có thể nhìn thấy lỗi chính tả và lỗi khi nhập, nhưng nếu bạn muốn mã của bạn có thể lấy mẫu - đang sử dụng # if- # else- # endif:

#if MY_USE_TEMPLATES 
template <typename T> 
#else 
typedef [**your-test-type-here**] T; 
#endif 
class List { 
... your code here ... 
} 

Trong Visual Studio 2015 điều này dường như hoạt động. Bạn có thể định nghĩa MY_USE_TEMPLATES thành 0 (sử dụng #define), phát triển mã của bạn với IntelliSense và tự động hoàn thành, v.v. (để bạn bớt sai sót), sau đó thay đổi MY_USE_TEMPLATES thành 1 khi bạn sẵn sàng kiểm tra hoặc biên dịch mã mẫu thực tế.

Khi bạn đã bật MY_USE_TEMPLATES, mã tham chiếu Danh sách của bạn sẽ dẫn đến lỗi (ví dụ: mã như 'Liệt kê danh sách') và bạn có thể giải quyết điều đó bằng một mẫu 'giả' bên trong câu lệnh #else. Tuy nhiên, điều tốt về việc rời mệnh đề #else mà không cần thêm 'mẫu' là: lỗi bạn nhận được khi tham chiếu Danh sách của bạn có thể phục vụ bạn như lời nhắc bật MY_USE_TEMPLATES trước khi kiểm tra mã, giảm xác suất của lỗi.(Kinh nghiệm cho thấy rằng dễ quên khi xử lý nhiều thứ và dự án lớn ...)

Hãy cẩn thận khi sử dụng nhiều định nghĩa kiểu như vậy, tuy nhiên: 'typedef ... T' chỉ có thể an toàn sử dụng một lần cho tên đó "T"; trong khi bạn có thể sử dụng 'typedef ... TYPE1' cho một lớp và 'typedef ... TYPE2' cho một lớp khác, bạn không thể sử dụng cùng một tên loại cho các loại khác nhau trừ khi bạn đặt tên loại khác nhau vào các không gian tên riêng biệt. (Tôi đã thử điều này trong Visual Studio 2015.)

Các vấn đề liên quan