2015-10-06 11 views
7

Hãy xem xét đoạn mã sau đây cho vector và ma trận nhân:C++: quá tải ambigous có thể được giải quyết nếu typedefs được thay thế

#include <array> 

template<typename T,size_t N> using vec = std::array<T,N>; 

template<typename T,size_t N,size_t M> using mat = vec<vec<T,M>,N>; 

template<typename T,typename U,size_t N> 
vec<T,N> operator*(const vec<T,N>& a,const vec<U,N>& b){ 
    return {}; //implement componentwise mult. 
} 

template<typename T,typename U,size_t N,size_t M,size_t L> 
mat<T,L,M> operator*(const mat<T,N,M>& a,const mat<U,L,N>& b){ 
    return {}; //implement matrix mult. 
} 

int main(){ 
    mat<float,4,4> a,b; 
    auto c = a * b; 
} 

tôi xác định 2 operator* quá tải, nơi một thứ hai sử dụng một cách rõ ràng ma trận.

Điều này sẽ dẫn đến lỗi "quá tải không rõ ràng" trên GCC 5.2, mặc dù theo ý kiến ​​của tôi, quá tải thứ hai là chuyên biệt hơn so với lần đầu tiên.

bây giờ tôi thay thế typedefs trong tình trạng quá tải thứ hai:

mat<T,L,M> operator*(const mat<T,N,M>& a,const mat<U,L,N>& b)

trở thành:

mat<T,L,M> operator*(const vec<vec<T,M>,N>& a,const vec<vec<U,N>,L>& b)

Edit:

tôi đã thực hiện một lỗi đánh máy nhỏ ... thats lý do tại sao độ phân giải làm việc, tôi đổi chỗ NL, do đó, loại bconst vec<vec<U,L>,N>& b.

Chỉ với lỗi đánh máy này, quá tải có thể được giải quyết bình thường.

Câu hỏi của tôi là: Hành vi này có được xác định rõ bởi tiêu chuẩn hoặc lỗi không?

+2

* "Bây giờ quá tải có thể được giải quyết bình thường." *, Tôi không thể tái sản xuất, và tôi nghi ngờ quá tải thứ hai là chuyên biệt hơn, vì điều đầu tiên chỉ khả thi cho các mảng có độ dài bằng nhau giữ cho tình trạng quá tải thứ hai) –

+0

Tôi đồng ý với @PiotrSkotnicki. Nó không phải là hiển nhiên là chuyên môn hơn. – Lingxi

+0

Không chuyên môn hơn ở đây. Bạn có thể thêm SFINAE để chọn tấm lót cho ma trận. – SergeyA

Trả lời

1

Với VS2015:

mã của bạn

template<typename T, typename U, size_t N> 
vec<T, N> operator*(const vec<T, N>& a, const vec<U, N>& b) { 
    return{}; //implement componentwise mult. 
} 

template<typename T, typename U, size_t N, size_t M, size_t L> 
mat<T, L, M> operator*(const mat<T, N, M>& a, const mat<U, L, N>& b) { 
    return{}; //implement matrix mult. 
} 

kết quả trong

Error C2593 'operator *' is ambiguous 

mơ hồ xuất phát từ thực tế là trong vec<T, N> operator*(const vec<T, N>& a, const vec<U, N>& b) T có thể được hiểu như là một vec<T,M>.

Và nếu tôi thay thế chúng như bạn đề nghị với

template<typename T, typename U, size_t N> 
vec<T, N> operator*(const std::array<T, N>& a, const std::array<U, N>& b) { 
    return{}; //implement componentwise mult. 
} 


template<typename T, typename U, size_t N, size_t M, size_t L> 
mat<T, L, M> operator*(const vec<vec<T, M>, N>& a, const vec<vec<U, N>, L>& b) { 
    return{}; //implement matrix mult. 
} 

kết quả không thay đổi.

Error C2593 'operator *' is ambiguous 

Bạn có chắc chắn về giải pháp của mình không? Có lẽ bạn không xem xét const?

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