c++ - 是否有可能使模板函数成为一堆类似类的朋友?
问题描述
我有一堆极其相似的矩阵类,它们的大小只有区别。
例如:
class clrMatrix8x8
{
public:
clrMatrix8x8();
clrMatrix8x8(const clrMatrix8x8&);
~clrMatrix8x8();
void fill(int);
static clrMatrix8x8 elemAdd(const clrMatrix8x8&, const clrMatrix8x8&);
static clrMatrix8x8 elemSubstr(const clrMatrix8x8&, const clrMatrix8x8&);
static clrMatrix8x8 elemMult(const clrMatrix8x8&, const clrMatrix8x8&);
static clrMatrix8x8 scalMult(const clrMatrix8x8&, int);
static clrMatrix8x8 elemDiv(const clrMatrix8x8&, const clrMatrix8x8&);
static clrMatrix8x8 scalDiv(const clrMatrix8x8&, int);
int& operator()(size_t, size_t);
clrMatrix8x8& operator=(const clrMatrix8x8&);
private:
std::array<std::array<int, 8>, 8> content;
};
有 16x16、32x32 等的类。它们的工作原理和功能都相同。对于clrMatrix8x8
,elemAdd
函数为:
clrMatrix8x8 clrMatrix8x8::elemAdd(const clrMatrix8x8& first_, const clrMatrix8x8& second_)
{
clrMatrix8x8 temp(first_);
for (size_t i = 0; i < temp.content.size(); i++)
{
std::transform(temp.content[i].begin(), temp.content[i].end(), second_.content[i].begin(),
temp.content[i].begin(), std::plus<int>());
}
return temp;
}
此函数与其他矩阵的相同函数之间的唯一区别是类名。
由于每个类的每个函数有 5 个类似的实现感觉不太好,我认为可以制作一个对所有矩阵类都友好的模板函数。所以,我template<class T> friend T elemAdd_text(const T&, const T&);
在Matrix.h
16x16 和 8x8 矩阵类声明和
template<class T>
T elemAdd_test(const T& ad, const T& af)
{
T temp(ad);
for (size_t i = 0; i < temp.size(); i++)
{
std::transform(temp.content[i].begin(), temp.content[i].end(), af.content[i].begin(),
temp.content[i].begin(), std::plus<int>());
}
return temp;
}
来Matrix.cpp
测试一下,但是当我main()
像这样调用这个函数时:some8x8matrixVariable = elemAdd_test(other8x8matrix_1, other8x8matrix_2);
它得到 LNK2001“未解析的外部符号”错误。我究竟做错了什么?
vector
我知道只使用 a of s会容易得多vector
,我测试了array
基于 - 的矩阵的工作速度快了约 6 倍,并且我需要尽可能多的性能。
解决方案
推荐阅读
- python - 有没有办法在运行五秒钟后自行结束这个 python 脚本?
- c++ - OSDynamicCast 未在基本驱动程序套件示例中编译
- protocol-buffers - 如何在不分配另一个字段的情况下在另一条消息中重用 protobuf 消息?
- sql - 配置 SQLFluff 规则
- python-3.x - Bet365.com 未在 QWebEngineView 中加载
- c++ - C++ 中某处的“int”是否有任何正常的数学商和余数?
- r - 表达式后的数字字符串提取
- python - 基本 Django 网址(主页:未定义名称)
- visual-studio - 终端 VSCO 未运行
- amazon-web-services - 使用 mssh 连接到 AWS Educate EC2 实例时连接被拒绝