C++ 无法专用化函数模板
C++ Failed to specialize function template
我对函数模板有问题。我遇到的错误是:"未能使用以下模板参数专门化函数模板"T sumfun(T &,size_t):坐标 [3]"。有谁知道如何纠正这一点?我尝试了"template coord sumfun(T & ob, size_t ndim)",但它犯了更多错误。
template <class T> T sumfun(T &ob, size_t ndim){
T sum();
for(size_t i = 0 ; i <= ndim ; i++)
sum + = ob[i];
return sum;
};
class coord
{
double *crd;
public:
coord(){crd[0]=0;crd[1]=0;};
coord(double xx, double yy) {
alloc();
crd[0] = xx; crd[1] = yy;
}
coord & operator + ( const coord &prawy);
private:
void alloc() {
try {
crd = new double [2];
}catch(bad_alloc) {
}
}
};
coord & coord::operator+(const coord &prawy){
coord tmp(0,0);
tmp.crd[0] = crd[0] + prawy.crd[0];
tmp.crd[1] = crd[1] + prawy.crd[1];
return tmp;
};
int _tmain(int argc, _TCHAR* argv[])
{
coord tab[] = {
coord(0, 0), coord(1,2), coord(2, 1) };
coord sum = sumfun(tab, sizeof(tab)/sizeof(coord));
//cout << sum;
system("pause");
return 0;
}
我不能改变主函数,所以参数必须像:
coord sum = sumfun(tab, sizeof(tab)/sizeof(coord));
问题是您正在传递一个数组,但传递数组的语法需要它的大小。幸运的是,您可以让模板扣除为您计算大小:
template <class T, std::size_t N>
T sumfun(const T (&ob)[N])
{
T sum = T();
for(std::size_t i = 0 ; i < N ; ++i)
sum += ob[i];
return sum;
}
另请注意,T sum()
是一个函数声明,这就是为什么我将其更改为 T sum = T()
. T sum{};
也会起作用。
编辑:如果无法更改main
,请为ndim
添加第二个参数。然后,您可以检查此数字是否不大于N
:
template <class T, std::size_t N>
T sumfun(const T (&ob)[N], std::size_t ndim)
{
if (ndim > N)
// error, raise an exception or something
T sum = T();
for(std::size_t i = 0 ; i < ndim; ++i)
sum += ob[i];
return sum;
}
当然,你也可以使用 std::accumulate
,作为一个极其懒惰的程序员,这将是我的首选解决方案:
coord sum = std::accumulate(std::begin(tab), std::end(tab), coord());
相关文章:
- 具有常量引用参数的函数模板专用化
- 如何减少函数模板专用化?
- 类成员函数的函数模板专用化
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- 类和成员函数模板专用化出错
- C++ 模板化基类的函数模板专用化
- C++函数模板专用化和重载
- 函数模板专用化生成链接错误
- 视图和跨步视图以及常量噩梦的函数模板专用化
- 函数模板专用化语法聚合模板化类型
- 澄清了使用 enable_if 的成员函数模板专用化
- 带有 clang 的 MacOSX 中的函数模板专用化
- 模板化函数模板专用化
- 在C++中创建成员函数模板专用化
- C++ 中的函数模板专用化和右值引用
- 命名空间中的函数模板专用化
- 常量和非常量 gsl::span 参数的函数模板专用化
- 如何选择函数模板专用化
- C++单个构造函数模板专用化
- 这是部分函数模板专用化