【发布时间】:2015-07-13 13:47:14
【问题描述】:
假设我有一个模板类,它有一个模板友元函数希望实现一个值乘以一个数组(myArray)的函数:
template<typename T, int size>
class myArray{
T *_array;
public:
...
template<typename Val, typename Array>
friend myArray<T,size> operator*(const Val &lhs, const Array &rhs){
myArray<T,size> mat_t;
for(int i = 0;i < size; i++)
mat_t._array[i] = lhs * rhs._array[i];
return mat_t;
}
...
};
它适用于 VS2013。然后我把未绑定模板友元函数的定义移到外面:
template<typename Val, typename Array>
myArray<T,size> operator*(const Val &lhs, const Array &rhs){
myArray<T,size> mat_t;
for(int i = 0;i < size; i++)
mat_t._array[i] = lhs * rhs._array[i];
return mat_t;
}
这是不正确的!我想问题出在朋友函数的返回类型上。但我想不通。 那么如何在类声明之外定义这样的友元模板函数呢?
【问题讨论】:
-
您有问题吗?
-
模板的朋友可以notoriously difficult搞定。为第二种情况发布您的错误和朋友声明。
-
您希望 T 和尺寸是多少?你想支持 Array 是什么?也许您只希望 Array 成为另一个 myArray
在这种情况下,您应该指定它。但是如果你期望函数的返回类型独立于输入类型而变化,那么你需要指定它(然后它不能被推断出来)。 -
@tobi303 我的问题是如何在类声明之外定义友元函数。
-
@TartanLlama 朋友声明在上面的类中,只是删除了定义。错误类似于“T 无效且大小未声明”。
标签: c++ class templates c++11 friend-function