Đây không phải là bản sao. Tôi đã kiểm tra rất nhiều câu trả lời, câu hỏi thường gặp và các câu hỏi khác. Không có gì trong đó nói với tôi tin tức. Đây là mã được đơn giản hóa. Đó là tối thiểu để có được và giải thích các lỗi.toán tử mẫu có vẻ không rõ ràng về sự mơ hồ
/*** Polynomial.hpp ********************************************************/
namespace Modulus
{
// Forward declaration of the types and non-inline template friend functions.
template <typename T>
class Polynomial;
template <typename T>
Polynomial<T> operator +
(Polynomial<T> const & p,
Polynomial<T> const & q);
}
namespace Modulus
{
template <typename T>
class Polynomial
{
public:
Polynomial() { }
// [!] when you comment this in, you get the error.
//Polynomial operator + () const { return *this; }
friend Polynomial operator + <> (Polynomial const & p,
Polynomial const & q);
};
} // namespace
// Template: include .cpp file.
//#include "Polynomial.cpp"
///^ It is commented out, for compiling in one file.
/*** Polynomial.cpp ********************************************************/
namespace Modulus
{
template <typename T>
Polynomial<T>
operator + (Polynomial<T> const & p,
Polynomial<T> const & q)
{
return Polynomial<T>();
}
} // namespace
/*** main.cpp **************************************************************/
//#include "Polynomial.hpp"
using namespace Modulus;
int main()
{
Polynomial<int> p;
p + p;
return 0;
}
Khi tôi nhận xét dòng dưới [!]
trong, lỗi tôi nhận được là friends can only be classes or functions
(Clang ++) hoặc declaration of ‘operator+’ as non-function
(g ++).
Đối với tôi, có vẻ như trình biên dịch nhầm lẫn hai toán tử. Theo như tôi đã học được toán tử quá tải, toán tử đơn và nhị phân hoàn toàn độc lập và có thể là phân biệt duy nhất với số đối số của chúng.
Vậy tại sao lỗi xảy ra? Làm cho toán tử đơn nhất một người bạn sử dụng thực hành tiêu chuẩn, làm cho mã biên dịch tốt trên cả hai trình biên dịch.
Thú vị. Nếu bạn đặt toán tử 'duy nhất +' bên dưới khai báo người bạn của toán tử nhị phân, cả gcc và clang sẽ biên dịch nó mà không có khiếu nại, nếu bạn đặt nó ở trên, bạn sẽ gặp lỗi trình biên dịch. – Wintermute