【发布时间】:2015-03-04 16:22:31
【问题描述】:
我正在使用一个 mArray 类,它实现了具有可变维数的数值数据容器
template <typename T>
class mArray<T>: {
...
std::vector<T> my_data;
}
另一个类mImage继承自mArray并提供特定于图像的操作,另一个类mDcmImage继承自mImage并提供特定于格式的功能。
我认为这是一种非常简洁的方式来区分不同类型的功能。
一个示例或mArray 功能:逐元素添加:
// add a mArray to the data [1]
template <typename U>
void operator+= (const mArray<U>& other) {
if (other.getSizes() != getSizes())
throw std::invalid_argument {"incompatible sizes"};
else {
std::transform (my_data.begin(),
my_data.end(),
my_data.begin(),
my_data.begin(),
[]( const T &a, const U &b) { return a+b; } );
}
return;
}
// add an element to the data [2]
template <typename U>
void operator+= (const U& rhs) {
assert (!std::is_arithmetic<U>::value);
std::transform (my_data.begin(),
my_data.end(),
my_data.begin(),
[&rhs]( const T &lhs) { return lhs+rhs; } );
return;
}
(getSizes() 是一个 mArray 函数)
但是现在我的代码从文件中加载了mDcmImage<int>,当我使用时
typedef int intensity;
mDcmImage<intensity> im1 ("/tmp/test1.im");
mDcmImage<intensity> im2 ("/tmp/test2.im");
im1 += im2;
然后我收到以下错误:
mArray.hpp required from ‘struct mArray<T>::operator+=(const U&)
[with U = mDcmImage<int>; T = int]::<lambda(const int&)>’|
mArray.hpp required from ‘void mArray<T>::operator+=(const U&)
[with U = mDcmImage<int>; T = int]’|
test.cpp required from here|
mArray.hpp error: no match for ‘operator+’ in ‘lhs + rhs’|
换句话说:虽然我编写了另一个mArray的加法以及一个值的加法,但当我在主程序中调用+=运算符将两个数组相加时,它使用+=单个值的实现。
我已经尝试了几件事,例如
- 将
std::enable_if<std::is_arithmetic<U>::value >::type*用作operator+=的值版本——不允许,因为operator+=严格采用1 个参数 - 同时为
mImage和mDcmImage定义operator+=的两个版本——在这些级别上,它也使用了错误的实现。
在simplified example 中选择了正确版本的运算符是——为什么不现在呢?我不明白为什么重载解决方案在这里失败。
【问题讨论】:
标签: c++ templates operator-overloading overloading overload-resolution