2013-02-28 31 views
5

Tôi có một lớp mẫu với chức năng mẫu bạn. Tôi hiện đang có các mã sau đây và nó đang làm việc:Chuyển tiếp Bản khai mẫu Chức năng

template<class T> 
class Vector 
{ 
    public: 
    template<class U, class W> 
    friend Vector<U> operator*(const W lhs, const Vector<U>& rhs); 
} 

template<class U, class W> 
Vector<U> operator*(const W lhs, const Vector<U>& rhs) 
{ 
    // Multiplication 
} 

Tôi muốn cho giải pháp của tôi để có tờ khai phía trước của hàm bạn để tôi có thể có những lợi ích an ninh và one-to-one thư từ mà nó cung cấp so với phương pháp hiện tại của tôi. Tôi đã thử những điều sau nhưng tiếp tục gặp lỗi.

template<class T> 
class Vector; 

template<class T, class W> 
Vector<T> operator*(const W lhs, const Vector<T>& rhs); 

template<class T> 
class Vector 
{ 
    public: 
    friend Vector<T> (::operator*<>)(const W lhs, const Vector<T>& rhs); 
} 

template<class T, class W> 
Vector<T> operator*(const W lhs, const Vector<T>& rhs) 
{ 
    // Multiplication 
} 
+1

y không sử dụng bản gốc 'friend' khai –

+0

Với phiên bản gốc, tất cả các mẫu instantiations của Vector là bạn bè với tất cả các mẫu instantiations của nhà điều hành *. Tôi thích giải pháp thứ hai mà Vectors sẽ không cho phép tất cả các bản mẫu khác nhau là bạn bè. – noddy

Trả lời

3

Tôi nghĩ bạn gần như đã có nó. Bạn chỉ cần thực hiện chức năng một mẫu tham số duy nhất khi bạn kết bạn. Sau đây biên dịch trên g ++ 4.5 mặc dù kể từ khi tôi không thể kiểm tra instantiation với trường hợp thử nghiệm của bạn tôi không chắc chắn 100% nó sẽ giải quyết vấn đề thực sự của bạn.

template<class T> 
class Vector; 

template<class T, class W> 
Vector<T> operator*(const W lhs, const Vector<T>& rhs); 

template<class T> 
class Vector 
{ 
    public: 
    template<class W> 
    friend Vector<T> operator*(const W lhs, const Vector<T>& rhs); 
}; 

template<class T, class W> 
Vector<T> operator*(const W lhs, const Vector<T>& rhs) 
{ 
    // Multiplication 
} 
+0

Mã biên dịch, [nhưng nó thắng 'liên kết] (http://ideone.com/KIT4lV). Chức năng của bạn bè và mẫu chức năng miễn phí là các khoản khấu trừ khác nhau. – WhozCraig

+0

Tôi gặp lỗi giống như WhozCraig khi sử dụng trình biên dịch GNU. Nó hoạt động trên Visual Studio C++ tuy nhiên. – noddy

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