2013-07-30 42 views
9

Tôi có một lớp học như thế này:bè chức năng từ một lớp templated

#include "Blarg.h" 
// ... 

class Foo : public Bar {  
    // ... 
    static double m_value; 
    // ...  
}; 

Và một số khác như thế này:

template<class X, class Y> 
class Blarg : public Bar { 
    // ... 
    void SetValue(double _val) { Foo::m_value = _val; } 
    // ... 
}; 

Kể từ Foo 's m_value được tin (và tôi muốn giữ theo cách đó), tôi nghĩ tôi sẽ khai báo hàm SetValue làm bạn với lớp Foo để có thể truy cập thành viên tĩnh khi cần.

tôi đã cố gắng khai dọc theo những dòng trong khu vực công cộng Foo 's:

template<class X, class Y> friend void Blarg<X, Y>::SetValue(double _val); 

template<class X, class Y> friend void Blarg::SetValue(double _val); 

friend void Blarg::SetValue(double _val); 

... nhưng không may mắn trong việc biên soạn. Cú pháp thích hợp cho điều này là gì, nếu có thể?

+0

Bạn gặp phải lỗi nào với lỗi đầu tiên? – Praetorian

+1

"không may mắn trong biên dịch" không phải là mô tả kỹ thuật về lỗi bạn gặp phải. –

+0

Bạn cần phải viết một ';' sau mỗi định nghĩa lớp. –

Trả lời

7

Bạn phải xác định Blarg lớp trước Foo lớp để đánh dấu một trong số phương thức Blargfriend. Bạn có chắc chắn số Blarg được xác định (hoặc bao gồm) trước khi khai báo Foo với một dòng bạn bè không?

+2

Điều đó và sửa các loại chức năng của thành viên (loại trả về bị thiếu). +1 –

+0

^Rất tiếc! Cảm ơn vì đã bắt được điều đó! – nicole

0

Đây là cú pháp chính xác:

template<class T> 
class Bla 
{ 
public: 
    void toto(double val); 
};  

class Foo { 
    static double m_value; 
    template<typename T> 
    friend void Bla<T>::toto (double); 
} ; 

Ngoài ra, hãy chắc chắn rằng Bla được định nghĩa trước Foo.

3

Điều này dường như làm việc cho tôi:

template<class X, class Y> 
class Blarg : public Bar { 
    public: 
     void SetValue(double _val); 
}; 

class Foo : public Bar { 
    private: 
     static double m_value; 

    public: 
     template<class X, class Y> friend void Blarg<X,Y>::SetValue(double _val); 
}; 

template <class X, class Y> 
void Blarg<X,Y>::SetValue(double _val) 
{ 
    Foo::m_value = _val; 
} 

tôi phải phá vỡ sự phụ thuộc vòng tròn bằng cách định nghĩa Blarg đầu tiên và làm SetValue không inline. Khai báo bạn bè của bạn khá chính xác, ngoại trừ giá trị trả về còn thiếu.

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