2015-11-03 60 views
-1

昨天我看到这里 link一个问题。创建模板,模板类重载操作

它有答案,但它不为我工作。

所以,在第一个问题

NSize<30, unsigned char, unsigned short> a(101); 
NSize<25, unsigned char, unsigned short> b(120); 
NSize<15, unsigned char, unsigned short> c(115); 
NSize<30> res = (a*b)*(a*c); 

而且模板类

template<int size,typename basic_type=unsigned int,typename long_type=unsigned long long,long_type base=256> 
class NSize 
{ 
    ... 
} 

和解决方案从Lol4t0

template <int lengthA, int lengthB> 
NSize<lengthA + lengthB> operator * (const NSize<lengthA> &a, const NSize<lengthB> &b) 
{ 
    return NSize<lengthA + lengthB>(...); 
} 

因此,我们有非常大的数字。对于他们我们有我们的NSize类,其中size是我们可以为这个数字存储多少位数。

因此,NSize<3>我们可以存储它的999

我们希望有重载NSize一些运营商的最大数量。当size类似时很容易,但当size不同时,我们遇到问题。

Lol4t0's解决方案并没有为我工作,而这正是克利翁返回我

error: 'NSize<max(aS, bS)> NSize<size, basic_type, long_type, base>::operator*(NSize<aS>&, NSize<bS>&)' must take either zero or one argument 
    NSize<max(aS,bS)> operator * (NSize<aS> &a, NSize<bS> &b) 

error: no match for 'operator*' (operand types are 'NSize<30, unsigned char, short unsigned int>' and 'NSize<30, unsigned char, short unsigned int>') 
    NSize<30, unsigned char, unsigned short> resc = (a*b)*(a*c); 

有什么建议?

+0

是这个实际的代码?它看起来您正在使用非const引用 –

+0

@PiotrSkotnicki 是的,有常量n大小有,但改变了它,当我试图让工作方案。 –

+1

请将您的实际代码发布在[最小,完整和可验证的示例](http://www.stackoverflow.com/help/mcve)中。它看起来好像你试图让'operator *'成为一个成员函数,在这种情况下它应该只有一个参数(这是你的编译器告诉你的)。 – Barry

回答

2

这不是那么容易弄清楚这个问题没有一个编译的例子,但对我来说这似乎是以下几点:你超载乘法运算符只对默认模板参数来定义。也就是说,代码

template <int lengthA, int lengthB> 
NSize<lengthA + lengthB> operator * (const NSize<lengthA> &a, const NSize<lengthB> &b) 
{ 
    return NSize<lengthA + lengthB>(...); 
} 

对应

template <int lengthA, int lengthB> 
NSize<lengthA + lengthB, unsigned int, unsigned long long, 256> operator * 
(const NSize<lengthA, unsigned int, unsigned long long, 256> &a, const NSize<lengthB, unsigned int, unsigned long long, 256> &b) 
{ 
    return NSize<lengthA + lengthB, unsigned int, unsigned long long, 256>(...); 
} 

但接下来,你有两个班型称它为

NSize<some_integer, unsigned char,  unsigned short> 
        //^^^^^^^^^^^^   ^^^^^^^^^^^^^^ 
        //not: unsigned int not: unsigned long long 

解决方法很简单:拼出所有相关您的operator*定义中的模板参数,可让您对返回的参数类型进行详细控制。

如果你发现自己做所有的时间,你可能更喜欢使用std::common_type般的辅助类,

template<typename T, typename S> 
struct common_type 
{ 
    using type = typename std::common_type<T, S>::type; 
}; 

template<int size1, typename basic_type1 /*, ... */ 
     , int size2, typename basic_type2 /*, .. */> 
struct common_type<NSize<size1, basic_type1 /*, ... */> 
       , NSize<size2, basic_type2 /*, ... */> > 
{ 
    using type = NSize<size1+size2, typename std::common_type<basic_type1,basic_type2>::type /*, ... */ >; 
}; 

,并返回作为乘法运算的结果:

template<typename ... Args1, typename ... Args2> 
auto operator*(Nsize<Args1 ...> const& nsize1, Nsize<Args2 ...> const& nsize2) 
    -> typename common_type<Nsize<Args1 ...>, Nsize<Args2 ...> >::type 
{ 
    //... 
} 
+0

是的,我错过了那部分:) – Lol4t0