用c ++中的模板调用'IIRFilter <double> :: IIRFilter()'没有匹配函数</double>

时间:2014-05-26 16:00:15

标签: c++ eigen

这是我的代码。我不知道应该添加哪些细节...你可以看到我使用了eigen。在输出中,它表示错误与解调器构造函数的定义一致。

所以基本上我有一个模板类解调器,它可以解调某种类型的矩阵(double,float等)。在解调器中我使用IIRFilter,它也应该能够处理解调器的类型。

此外,过滤器不仅可以过滤矩阵,还可以过滤掉它们的块,所有这些代码

template<typename Derived, typename DerivedB>

^^^^

        /*
         * Demodulator.h
         *
         *  Created on: May 23, 2014
         *      Author: ii
         */

        #ifndef DEMODULATOR_H_
        #define DEMODULATOR_H_

        #include <Eigen/Dense>
        #include <Eigen/Core>

        #include <iostream>
        #include "IIRFilter.h"

        using namespace std;
        using namespace Eigen;
        template <typename T>
        class Demodulator {
        public:
            Matrix<T, Dynamic, Dynamic> tempMatrix;
...
            IIRFilter<T> bandpassFilter;
            IIRFilter<T> highpassFilter;
            // Here is the error. In the line below.
            Demodulator(int rows, int columns) {

                tempMatrix = Matrix<T, Dynamic, Dynamic>(rows, columns);
                tempFrame = Matrix<T, 1, Dynamic>(1, rows);
                ...
                Matrix<T, 1, Dynamic> tempb1(7);
                tempb1 << 6.46597871e-01,   0.00000000e+00,  -1.93979361e+00,
                         1.66081634e-16,   1.93979361e+00,   0.00000000e+00,
                        -6.46597871e-01;

                bandpassFilter = IIRFilter<T>(tempa1, tempb1,  rows);
                Matrix<T, 1, Dynamic> tempb2(4);
                tempb2 << 0.97749153, -2.93247458,  2.93247458, -0.97749153;
                Matrix<T, 1, Dynamic> tempa2(3);
                tempa2 << -2.95447065,  2.90997187, -0.95548968;

                highpassFilter = IIRFilter<T>(tempa2, tempb2, rows);
...


            }
            ~Demodulator();

            void demodulateFrame(Matrix<T, Dynamic, Dynamic> &frame);
        };

        #endif /* DEMODULATOR_H_ */


    /*
     * IIRFilter.h
     *
     *  Created on: May 23, 2014
     *      Author: ii
     */

    #ifndef IIRFILTER_H_
    #define IIRFILTER_H_
    #include <Eigen/Dense>

    using namespace std;
    using namespace Eigen;
    template <typename T>
    class IIRFilter {
    public:

        Matrix<T, Dynamic, Dynamic> previousOutput;

        template<typename Derived, typename DerivedB>
        void filterRow(const MatrixBase<Derived>& input,  MatrixBase<DerivedB> const &  output, int row);

...


        IIRFilter(Matrix<T, 1, Dynamic> _alpha, Matrix<T, 1, Dynamic> _beta, int rows) {
            ...
        }
        ~IIRFilter();
    };




    #endif /* IIRFILTER_H_ */


    void testDemodulation() {
        MatrixXd input ...
        MatrixXd inputRow = input.row(0);

        Demodulator<double> demodulator(input.rows(), input.cols());
        demodulator.demodulateFrame(inputRow);
        cout << demodulator.outputFrame;

    }

1 个答案:

答案 0 :(得分:0)

您必须初始化您的成员变量。由于该类缺少默认构造函数,因此该初始化必须是显式的。这有一个特殊的语法:

class Demodulator {

    Demodulator(int rows, int columns) 
           : bandpassFilter ( something ),                // <=== here
             highpassFilter ( something-else ) {          // <=== here
       // your code 
    }

不幸的是,这些成员需要矩阵作为构造函数参数,而这些矩阵尚不可用。

你可以

  • 重新组织您的代码,以便此时可以使用这些矩阵,并删除bandpassFilter =highpassFilter =分配或
  • 为IIRFilter类模板添加默认构造函数,以便默认启用初始化,并保留分配