缺少模板参数和类实现错误

时间:2018-11-17 21:21:05

标签: c++ class

我是C ++的新手,所以如果一切都还不尽人意,我会向您道歉。

下面是我主要功能的前几行。我在第六行收到一个错误:“在c1之前缺少模板参数”。如您在下面进一步看到的,“复杂”类必须将数据成员加倍,这两个成员都应使用默认构造函数初始化为0。输入complex可以解决此错误,但我不认为我首先需要模板。另一个问题是,在进行此更改之后,编译器无法识别我怀疑使用c1.get_real()的第一个成员函数,我怀疑这是由于添加了模板参数。

#include <fstream> // For ofstream class declaration
#include <iostream> // For cout, endl
#include <Complex> // So we can access the complex class declaration (hint: see Complex.cpp)
#include <string>


int main()
{
    string filename; filename = "complex-test.txt";
    ofstream fout(filename.c_str());
    fout<<"Defining complex object c1 and calling default ctor"<<endl;
    complex c1;
    fout<<"Testing accessors and that default ctor initialized c1 to 0 + 0i"<<endl;
    fout<<"c1.get_real() returned "<<c1.get_real()<<endl;

实现我的类成员函数的我的Complex.cpp文件:

#include <iomanip>      // For fixed, setprecision()
#include <sstream>      // For stringstream class
#include "Complex.hpp"  // For the complex class declaration

using namespace std;

//--------------------------------------------------------------------------------------------------
// + complex() :
// PSEUDOCODE
// Call init() passing 0 and 0 as the arguments.
//--------------------------------------------------------------------------------------------------
    complex::complex()
    {
        init(0,0);
    }


 complex::complex(double init_real, double init_imag)
 {
    init(init_real, init_imag);
 }


 double complex::get_imag()
 {
     return m_imag;
 }


double complex::get_real()
{
    return m_real;
}


void complex::init(double init_real, double init_imag)
{
    m_real = init_real;
    m_imag = init_imag;
}


void complex::set_imag(double s)
{
    m_imag = s;
}


void complex::set_real(double s)
{
    m_real = s;
}


//--------------------------------------------------------------------------------------------------
// + to_string() : string
//
// DESCRIPTION
// Returns a string representation of the complex object. For example, if m_real is -2.3333333
// and m_imag is -21.456789123, this function will return the string "(-2.3333 - 21.4568i)".
//
//--------------------------------------------------------------------------------------------------
string complex::to_string()
{
    stringstream sout;
    sout << fixed << setprecision(4);
    sout << "(" << get_real();
    double imag = get_imag();
    if (imag < 0) {
        sout << " - " << -imag << 'i';
    } else if (imag > 0) {
        sout << " + " << imag << 'i';
    }
    sout << ")";
    return sout.str();
}

这是该类的头文件:

#ifndef COMPLEX_HPP  // See the comments in the header comment block regarding these two lines.
#define COMPLEX_HPP

#include <string> // Included because we are using the string class in to_string()
using namespace std;

class complex
// Write the public section of the class declaration.
{
    public:

    complex();

    complex(double , double);

    double get_imag();

    double get_real();

    void set_imag(double);

    void set_real(double);

    string to_string();
    private:

    void init(double, double);

    double m_real;

    double m_imag;
};

#endif

1 个答案:

答案 0 :(得分:4)

问题

如果您在不区分大小写的操作系统(Windows?)上运行编译器,则此行:

#include <Complex> // So we can access the complex class declaration (hint: see  Complex.cpp)

将导致包括标准标头<complex>(全部小写),并因此加载模板std::complex。请注意,在linux系统上,您将得到正确的错误(找不到带有upaercase的标头Complex)。

然后,您的代码中有两种复杂类型:std::complexcomplex。您拥有using namespace std的事实使complexstd::complex成为同义词。这是您的错误出处。

解决方案

首先,如果不需要标准复合体,则不要包含它。因此,在主机中,使用与complex.cpp中相同的包含:

#include "Complex.hpp"  // For YOUR complex class declaration

第二,避免使用using namespace stdAt least in your headers。只需在标准对象前加上std::。或列出您明确要使用的标准对象,但不带前缀:using std::cout;

附加说明:一些C++ styles建议使用起始大写字母来定义您自己的类名称。这样可以防止与std发生冲突。但是,这种方法不能代替上面的建议,因为使用其他相同样式的库可能会发生名称冲突。