2015-03-28 19 views
6

Đâ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.

+2

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

Trả lời

4

Khi bạn khai báo nội dung nào đó trong phạm vi, nó ẩn các ô tô cùng tên trong bất kỳ phạm vi rộng hơn nào. Ở đây, tuyên bố của thành viên operator+ ẩn của thành viên không phải là thành viên. Vì vậy, tuyên bố friend đề cập đến các thành viên, không phải là thành viên không, do đó lỗi.

Bạn sẽ cần phải hội đủ điều kiện tên nếu bạn muốn tham khảo cả hai trong cùng một phạm vi:

Polynomial  operator +  () const { return *this; } 

friend Polynomial Modulus::operator + <> (Polynomial const & p, Polynomial const & q); 
        ^^^^^^^^^ 
+0

Dường như tiêu đề thực của OP bao gồm tệp nguồn ở dưới cùng. – chris

+1

@chris: Vậy là vậy. Thật khó chịu. –

+0

Nó là đủ phổ biến, nhưng thông thường, phần mở rộng sẽ là một cái gì đó khác hơn là cpp. Không libstdC++ sử dụng tpp? – chris

Các vấn đề liên quan