Khi tôi biên dịch đoạn mã sau, tôi nhận được một lỗi biên dịch với kêu vang, nhưng không phải với g ++/MSVC:lỗi Strange với một nhà điều hành templated quá tải
#include <string>
template<typename T> struct Const {
explicit Const(T val) : value(val) {}
T value;
};
template<typename T> struct Var {
explicit Var(const std::string &n) : name(n) {}
std::string name;
};
template<typename L, typename R> struct Greater {
Greater(L lhs, R rhs) : left(lhs), right(rhs) {}
L left;
R right;
};
template<typename L>
Greater<L, Const<int> > operator > (L lhs, int rhs) {
return Greater<L, Const<int> >(lhs, Const<int>(rhs));
}
template<typename R>
Greater<Const<int>, R> operator > (int lhs, R rhs) {
return Greater<Const<int>, R>(Const<int>(lhs), rhs);
}
Var<double> d("d");
int main() {
d > 10;
return 0;
}
Các lỗi thông báo như sau:
error: overloaded 'operator>' must have at least one parameter of
class or enumeration type
Greater<Const<int>, R> operator > (int lhs, R rhs) {
^
./val.h:31:24: note: in instantiation of function template specialization
'operator><int>' requested here
Greater<Const<int>, R> operator > (int lhs, R rhs) {
^
1 error generated.
là về chức năng điều hành không được sử dụng. Nếu, thay vào đó, tôi viết 10> d thay vì d> 10, sau đó tôi nhận được cùng một lỗi về hàm operator> khác. Phần trên biên soạn tốt theo gcc 4.4.6 và VS2012. Lỗi của tôi là gì ?
Cảm ơn bạn.
Nó cũng biên dịch tốt với gcc 4.8.1: http://ideone.com/wG4Yzv (chế độ C++ 98) và http://ideone.com/8fwOWq (chế độ C++ 11). Phiên bản của bạn là gì? –
@gx_ Chỉ cần thử 3.1 và 3.2, cả hai đều có vấn đề. – BoBTFish
@BoBTFish Cảm ơn (quá xấu không có "Clang trực tuyến" (nữa)). Tôi tự hỏi về ví dụ rất đơn giản http://ideone.com/0Aooxo?_Edit: _ oh chờ đợi, có clang 3.0 tại http://gcc.godbolt.org/ :) và ví dụ đơn giản của tôi gây ra lỗi tương tự. _Edit (2): Cảm ơn một lần nữa. Dường như một lỗi trình biên dịch ..._ –