2009-10-15 15 views
7

Zastanawiam się, czy istnieje sposób, aby uzyskać lepsze informacje na temat lokalizacji błędu w msvc (2005)?Czy istnieje sposób na uzyskanie lepszych informacji w kontekście błędu podczas korzystania z msvc? (ex: C2248)

Na przykład, gdy dziedziczenie z boost :: noncopyable w klasie pojawia się błąd C2248 mówi coś takiego:

błędu C2248: 'boost :: noncopyable _ :: noncopyable :: noncopyable': nie można dostęp członek prywatny zadeklarowany w klasie 'boost :: noncopyable _ :: noncopyable'. diagnostyczny wystąpił w funkcji kompilator generowane „MyClass :: MojaKlasa (const myClass &)”

ale nie powie mi, gdzie dokładnie konstruktor kopia została wywołana. To trochę denerwujące. Naprawdę nie jestem pewien, ale myślę, że pamiętam, widząc ustawienia gdzie mogę określić poziom wyjściowy lub coś, ale szukałem i nic nie znalazłem, więc moje pytanie brzmi: Czy istnieje sposób, aby uzyskać lepszy (pełniejszy?) Komunikat o błędzie w msvc ?

Edytuj: Cóż, odkąd stackoverflow właśnie powiedział mi, że powinienem popatrzeć na odpowiedź, zastanawiałem się, czy ktoś mógłby powiedzieć, czy msvc 2008/2010 daje lepszą diagnostykę dla tego błędu? Ktoś też wspomniał, że GCC powinien zrobić, czy ktoś może to potwierdzić? Co z innymi kompilatory Comeau (Intel ?,?)

Dzięki

+2

Zdarzyło mi się to również wcześniej. Być może warto byłoby go zgłosić na connect.microsoft.com – jalf

+0

Wygląda na to, że został już zgłoszony i zamknięty jako wont-fix, ponieważ został uznany za niewystarczająco ważny. Dzięki za link, o którym nie wiedziałem. Wygląda na to, że może się przydać. – n1ckp

+0

Oto link do połączenia, jeśli ktoś ma ochotę zagłosować: https://connect.microsoft.com/VisualStudio/feedback/details/467747/compiler-shows-error-but-with-no-hint-to-the -users-source-code. Po prostu miał podobny problem z brakującym średnikiem na końcu definicji klasy i vs nie dałby mi żadnej użytecznej wskazówki na temat błędu. – n1ckp

Odpowiedz

4

Mogę potwierdzić za pomocą Code :: Blocks i VC++ 2005, że nie daje to żadnej wskazówki, gdzie występuje błąd. Nie pomaga także deklarowanie własnego konstruktora kopii prywatnej.

#include <boost/noncopyable.hpp> 

class X: boost::noncopyable 
{ 
}; 

void foo(X x) {} 

int main() 
{ 

    X x; 
    foo(x); 
} 

Dziennik kompilacji (linia pięć jest ostatni wiersz deklaracji klasy):

main.cpp(5) : error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable' C:\boost_1_38_0\boost/noncopyable.hpp(27) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable' C:\boost_1_38_0\boost/noncopyable.hpp(22) : see declaration of 'boost::noncopyable_::noncopyable' This diagnostic occurred in the compiler generated function 'X::X(const X &)'

O ile nie jest to przełącznik kompilator, aby umożliwić dokładniejsze diagnozowanie błędów, to Wouldn pierwszy raz po prostu skompiluj plik za pomocą GCC (MinGW), aby uzyskać bardziej pomocną diagnostykę błędów. (Niestety, twój kod powinien być wolny od rozszerzeń VC++.)

+0

Nie pamiętam, że o ne. Przynajmniej można się domyślić, jaki jest problem z niemożliwym do skopiowania. –

+0

Problem nie dotyczy niekopiowania. Problem polega na tym, że * twój * kod próbuje skopiować coś, co nie powinno być kopiowane. – UncleBens

+1

To, co miałem na myśli. Korzystając z funkcji, której nie można skopiować, można przynajmniej szybko dowiedzieć się, co to oznacza, w przeciwieństwie do innych przypadków użycia. Nie ma również użytecznego przełącznika cl.exe, który rzuca więcej światła na ten temat. –

-1

W oknie wyjściowym lub kompilacji zalogować powinieneś zobaczyć gdzie kompilator próbował użyć szablonu w kodzie ... masz do przewijania choć trochę.

Jeśli nie ma wystarczająco dużo informacji w dziennikach budowy, istnieje również możliwość kontrolowania msbuild gadatliwość:
Narzędzia-> Opcje-> Projekty i Solutions> Zbuduj i Run-> MSBuild wyjściowe projekt Oznajmiania

+0

Dziękuję, to były dokładnie opcje, o których myślałem, postaram się sprawdzić, czy dadzą więcej informacji i zgłoś się, dzięki. – n1ckp

+2

Próbowałem, niestety, to nie pomaga - patrz odpowiedź UncleBens –

0

Możesz tymczasowo utworzyć ręczny konstruktor kopii (z tą samą sygnaturą) i domyślną implementację, tylko w celu śledzenia tego błędu ..? Nie jestem pewien, czy to ułatwiłoby znalezienie.

+0

Moje pytanie jest niezwiązany z tym konkretnym błędem Mój aktualny błąd nie jest związany z konstruktorem kopiowania.To był przykład, ale nadal dziękuję za odpowiedź – n1ckp

-1

Otwórz okno wyjściowe, w którym wyświetlany jest pełny dziennik budynku. Sprawdź komunikat o błędzie. Pod tym komunikatem o błędzie można zazwyczaj znaleźć więcej informacji, które mogą pomóc w zidentyfikowaniu źródła problemu.

Po dwukrotnym kliknięciu problemu na liście błędów i przejściu do okna wyników kursor zostanie ustawiony na ten komunikat o błędzie.

+0

Hmm Wiedziałem, że powinienem skopiować/wkleić cały ciąg, więc nie sądzę, że mam to z okien błędów. Mam to z okien wyjściowych i jedynym odnośnikiem, który znalazłem, jest błąd w pliku .cpp, w którym wystąpił błąd, ale chciałbym znać lokalizację wywołania konstruktora kopiowania lub więcej info I can get. Dzięki i tak – n1ckp

+0

Z szablonami zwykle trzeba przewinąć w dół za jakiś "hałas", aby dostać się do części, w której podane jest twoje źródło –

0

Właściwie, to najlepszy sposób, aby obejść ten tutaj (VS2013) wydaje się czołgać nad oknem wyjściowym iteracyjnie:

1 /, gdy pojawi się komunikat „Ten tryb diagnostyczny nastąpiło w funkcji kompilator generowane„X :: X (const X &) "" na wyjściu, przejdź do klasy 'X' i jawnie usuń konstruktora kopiowania, używając notacji C++ 11: "X (const X &) = delete;"

2/ponowna kompilacja, teraz wynik musi wyświetlać ten sam błąd, ale z diagnostyką występującą w klasach potomnych, a następnie ponownie wykonać pętlę do kroku 1, aby wyraźnie usunąć konstruktora kopii na lekcji podrzędnej, aż do rzeczywistego błędu klasa ...

Powiązane problemy