Tôi hy vọng danh hiệu thực sự mô tả những gì tôi muốn hỏi ...C++ gọi phương thức và loại có độ phân giải phạm vi nhập nhằng
Tôi đã viết một đoạn mã mà biên dịch với gcc và các công trình như tôi mong muốn. Tuy nhiên, nó không biên dịch với llvm và mã thực thi khác khi được biên dịch với icc!
Dưới đây là một ví dụ về các vấn đề:
#include <iostream>
using std::cout; using std::endl;
class A {
public:
virtual void foo() { cout << "A::foo()" << endl; }
};
class B : public A {
public:
typedef A base;
virtual void foo() { cout << "B::foo()" << endl; }
};
int main() {
typedef B base;
base* bp = new B();
bp->base::foo();
}
gcc đầu ra: A :: foo()
icc đầu ra: B :: foo()
ai đó có thể giải thích những gì hiện tiêu chuẩn nói về trường hợp này?
Tôi sẽ nói đó là lỗi trong GCC và ICC, vì 'B :: base' không phải là _member_ của' B', có nghĩa là không nên truy cập nó như một thành viên ('bp-> base'). –
Tôi đồng ý với @JoachimPileborg, hơn nữa 'cơ sở' có thể được hiểu là B trong phạm vi này. Bạn đã biên soạn với cờ Cảnh báo chưa? (-Wall cho gcc) – Geoffroy
Không phải chỉ là hành vi không xác định, bởi vì 'main' không phải là dạng yêu cầu? Có vẻ như tất cả các trình biên dịch đều đúng. –