Tôi đã gặp phải một số mã mà tôi nghĩ rằng nên biên dịch, nhưng không. Vì vậy, tôi hy vọng một số các chuyên gia tiêu chuẩn địa phương ở đây tại SO có thể giúp :-).Lỗi mẫu g ++ tiềm năng?
tôi về cơ bản có một số mã mà giống như thế này:
#include <iostream>
template <class T = int>
class A {
public:
class U {
};
public:
U f() const { return U(); }
};
// test either the work around or the code I want...
#ifndef USE_FIX
template <class T>
bool operator==(const typename A<T>::U &x, int y) {
return true;
}
#else
typedef A<int> AI;
bool operator==(const AI::U &x, int y) {
return true;
}
#endif
int main() {
A<int> a;
std::cout << (a.f() == 1) << std::endl;
}
Vì vậy, để mô tả những gì đang xảy ra ở đây. Tôi có một mẫu lớp (A
) có lớp nội bộ (U
) và ít nhất một hàm thành viên có thể trả về một thể hiện của lớp nội bộ đó (f()
).
Sau đó, tôi đang cố tạo hàm operator==
so sánh loại nội bộ này với một loại khác (trong trường hợp này là int
, nhưng dường như không quan trọng).
Khi USE_FIX
là không định nghĩa tôi nhận được lỗi sau:
test.cc: In function 'int main()':
test.cc:27:25: error: no match for 'operator==' in 'a.A<T>::f [with T = int]() == 1'
Mà dường như lẻ, vì tôi là rõ ràng (tôi nghĩ) xác định một templated operator==
mà nên bao gồm này, trên thực tế nếu tôi chỉ làm một chút công việc cho trình biên dịch (cho phép USE_FIX), sau đó tôi không còn nhận được một lỗi. Thật không may, "sửa lỗi" không hoạt động một cách tổng quát, chỉ cho một phiên bản cụ thể của mẫu.
Đây có phải là hoạt động như tôi mong đợi không? Hay điều này đơn giản là không được phép?
BTW: nếu vấn đề tôi đang sử dụng gcc 4.5.2.
Đơn giản là không được phép. Nếu tôi biết thêm về vấn đề của bạn, tôi có thể đề xuất thiết kế lại phù hợp. –
+1 cho câu hỏi hay. :-) – Nawaz
có thể trùng lặp của [Làm thế nào để suy ra loại lớp từ kiểu phương thức trong các mẫu C++?] (Http://stackoverflow.com/questions/3830491/how-to-deduce-class-type-from-method-type- in-c-templates) –