首页 > 解决方案 > 是否有可能使模板函数成为一堆类似类的朋友?

问题描述

我有一堆极其相似的矩阵类,它们的大小只有区别。

例如:

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 等的类。它们的工作原理和功能都相同。对于clrMatrix8x8elemAdd函数为:

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.h16x16 和 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 倍,并且我需要尽可能多的性能。

标签: c++templates

解决方案


推荐阅读