tly*_*tly 7 c++ operator-overloading c++11
考虑以下用于向量和矩阵乘法的代码片段:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我定义了2个operator*重载,其中第二个重载明确使用矩阵.
这将导致"模糊过载"错误GCC 5.2,但在我看来,第二次过载比第一次过载更专业.
我现在替换第二个重载中的typedef:
mat<T,L,M> operator*(const mat<T,N,M>& a,const mat<U,L,N>& b)
变为:
mat<T,L,M> operator*(const vec<vec<T,M>,N>& a,const vec<vec<U,N>,L>& b)
编辑:
我做了一个小错字......这就是为什么该决议的工作,我换N和L,这样的类型b是const vec<vec<U,L>,N>& b.
只有这个错字,才能正常解决过载问题.
我的问题是:标准或错误是否很好地定义了这种行为?
使用VS2015:
你的代码
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.
}
Run Code Online (Sandbox Code Playgroud)
结果是
Error C2593 'operator *' is ambiguous
Run Code Online (Sandbox Code Playgroud)
歧义源于以下事实: in vec<T, N> operator*(const vec<T, N>& a, const vec<U, N>& b)T 可以解释为 a vec<T,M>。
如果我按照你的建议替换它们
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.
}
Run Code Online (Sandbox Code Playgroud)
结果没有改变。
Error C2593 'operator *' is ambiguous
Run Code Online (Sandbox Code Playgroud)
您确定您的解决方案吗?也许你没有考虑const?
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |