2009-06-26 24 views
7

Tôi có phương thức tĩnh, MyClass::myMethod() trên một DLL khác, MyDll.dll. Trong mã của tôi, tôi gọi phương thức này, và nó biên dịch và chạy tốt.Tại sao tôi nhận được lỗi "chức năng thành viên không có mặt" khi đánh giá các biểu thức trên trình gỡ lỗi VC++?

Nhưng khi tôi cố gắng MyClass::myMethod() trong cửa sổ ngay lập tức (hoặc cửa sổ đồng hồ), tôi luôn nhận được:

MyClass::myMethod() 
CXX0052: Error: member function not present 

Tại sao vậy?

Cập nhật: Tôi đã phát hiện ra rằng khi tôi sử dụng context operator nó hoạt động:

{,,MyDLL}MyClass::myMethod() 

Tôi không thực sự chắc chắn lý do tại sao nó là cần thiết, tuy nhiên, vì vậy tôi sẽ phải chờ một chút để xem ai đó có lời giải thích hay không.

Cập nhật 2: Tôi được yêu cầu cung cấp thêm thông tin. Thật không may, những gì tôi mô tả là gần như tất cả tôi có. Đây là mã của bên thứ ba. Các phương pháp, mà nằm trên một DLL khác nhau, được khai báo như thế này:

class MyClass 
{ 
public: 
// ... 
_declspec(dllimport) static const char *getDirectory(void); 
} 

và nó được gọi như thế này:

MyClass::getDirectory() 

tôi đã không có nguồn. Nó được biên dịch trên chế độ gỡ lỗi theo VC++ 9.

+0

Chúng tôi có thể thấy một số mã không? – 0xC0DEFACE

+0

Có vẻ như cửa sổ xem không đủ thông minh và không thể định vị nguồn để chạy theo cách này. Bạn đã thử gói cuộc gọi này với một chức năng của riêng bạn - char * foo() {return MyClass :: getDir(); }? Nó có thể hoạt động theo cách này, vì nguồn của MyClass sẽ được giải quyết tại thời gian biên dịch chứ không phải là thời gian chạy. – eran

+0

Vì vậy, nó hoạt động ngay bây giờ? – ralphtheninja

Trả lời

2

Vâng, tôi không chắc chắn lý do tại sao, nhưng trình gỡ lỗi là không đủ thông minh để biết rằng lớp đó nằm trong một DLL khác, vì vậy bạn phải giải thích bằng cách sử dụng context operator:

{,,MyDLL}MyClass::myMethod() 
+0

Sau đó, tôi nhận được lỗi "Không thể đánh giá biểu thức". – newenglander

+0

Làm việc cho tôi (sau khi tôi tải PDB cho mô-đun). Cảm ơn! – Cameron

0

Điều này có thể do hàm tĩnh của bạn được xác định nội tuyến.

thử nghiệm của tôi với lớp này:

class myclass 
{ 
public: 
    static int inlinetest() 
    { 
     return 0; 
    } 
    static int test(); 
}; 

int myclass::test() 
{ 
    return 0; 
} 

mang lại cho tôi kết quả này trong cửa sổ ngay lập tức tôi:

myclass::inlinetest() 
CXX0052: Error: member function not present 
myclass::test() 
0 
+0

@fretje Nó không phải là nội tuyến - lớp này trong một, nguồn đóng, DLL. Tôi đã thực sự quản lý để có được nó để làm việc (xem bản cập nhật của tôi), nhưng tôi không thực sự biết tại sao. –

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