2011-01-09 17 views
7

Tôi đang chế giễu một lớp C++ trong đó có 2 chức năng quá tải sử dụng Google Mock và VS2010:Google Mock: chức năng quá tải chế giễu tạo các cảnh báo C4373

#include "stdafx.h" 
#include "gmock/gmock.h" 

#include "A.h" 

class MockA : public A 
{ 
public: 
    // ... 
    MOCK_METHOD3(myFunc, void(const int id, const int errorCode, const CString errorMsg)); 
    MOCK_METHOD1(myFunc, void(const CString errorMsg)); 
    // ... 
}; 

Mỗi lần tôi biên soạn tôi nhận được sau cảnh báo hai lần:

1>c:\dev\my_project\tests\mocka.h(83): warning C4373: 'MockA::myFunc': virtual function overrides 'A::myFunc', previous versions of the compiler did not override when parameters only differed by const/volatile qualifiers 
1>   c:\dev\my_project\my_project\include\a.h(107) : see declaration of 'A::myFunc' 

Bất kỳ ý tưởng nào về lý do?
Hành vi này có đúng không?
Làm cách nào để tránh điều này?

+1

Hãy chắc chắn rằng bạn đang sử dụng biến thể đúng - MOCK_CONST_METHOD nên được sử dụng khi 'phương pháp A' của bạn đang trọng là 'const'. –

+0

@Billy ONeal - Bản thân phương thức không phải là const, chỉ các tham số của nó là. Tôi vẫn nên sử dụng MOCK_CONST_METHOD? – Jonathan

+0

Không; trong trường hợp đó bạn nên làm những gì bạn đang làm :) –

Trả lời

9

Nếu đây là mã mới, bạn sẽ ổn thôi. Các C4373 warning nói rằng phiên bản cũ của Visual Studio vi phạm tiêu chuẩn. Từ các tài liệu liên quan:

Các phiên bản của trình biên dịch trước khi Visual C++ 2008 liên kết các chức năng để phương pháp này trong các lớp cơ sở, sau đó vấn đề một thông điệp cảnh báo. Các phiên bản tiếp theo của trình biên dịch bỏ qua const hoặc vòng loại dễ bay hơi, liên kết hàm với phương thức trong lớp bắt nguồn, sau đó phát hành cảnh báo C4373. Hành vi sau này tuân thủ tiêu chuẩn C++ .

Điều này sẽ chỉ là vấn đề nếu bạn đã phá mã dựa trên hành vi không chính xác của Visual Studio.

+0

Tôi chắc chắn hy vọng bạn đã đúng. Bạn có một tài liệu tham khảo để trở lại này lên? Một nơi nào đó mọi người thảo luận về điều này thực sự là hành vi sai lầm quá khứ? Ngoài ra - làm cách nào tôi có thể tắt cảnh báo cụ thể này? – Jonathan

+1

@Jon, nó được giải thích trong liên kết. Lưu ý phần cuối cùng, "Hành vi sau này tuân thủ tiêu chuẩn C++." –

+0

cảm ơn. Tôi sử dụng sau đây để ngăn chặn các cảnh báo: http://stackoverflow.com/questions/2541984/how-to-suppress-warnings-in-external-headers-in-visual-c – Jonathan

3

Đối với tôi (trong VS 2010), chỉ định const về thông số kiểu nguyên thủy (mà tôi thấy bạn cũng có) đã gây ra hành vi này. Bất cứ khi nào tồn tại trong hàm lớp cơ sở tôi muốn ghi đè, tôi không thể chỉ định mô hình theo cách để cảnh báo này không xảy ra; khi chỉ có tham số kiểu giá trị const/tham số const của lớp, cảnh báo không bao giờ xảy ra.

Vì vậy, đối với tôi, có vẻ như cảnh báo trong trường hợp đó thực ra là một sai lầm trong trình biên dịch (vì chữ ký giống hệt nhau).

0

đề nghị cách tiếp cận khác:

#include "stdafx.h" 
#include "gmock/gmock.h" 

#include "A.h" 

class MockA : public A 
{ 
public: 
    // ... 

    void myFunc(const int id, const int errorCode, const CString errorMsg) { 
     mocked_myFunc3(id, errorCode, errorMsg); 
    } 

    void myFunc(const CString errorMsg) { 
     mocked_myFunc1(errorMsg); 
    } 

    MOCK_METHOD3(mocked_myFunc_3, void(const int id, const int errorCode, const CString errorMsg)); 
    MOCK_METHOD1(mocked_myFunc_1, void(const CString errorMsg)); 
    // ... 
}; 
Các vấn đề liên quan