注册 登录
编程论坛 C++教室

我又来求助了:涉及到的知识:泛型编程,模板类,操作符重载,代码和问题在帖子里面

纯黑色 发布于 2013-08-04 21:03, 1073 次点击
代码如下:
程序代码:

#include <iostream>
#include <iterator>

 using namespace std;

 

 template <typename T>

 class complex

 {
     public:
         //complex(){real = 0;imag = 0;}
           complex(T oreal,T oimag)
        {
            real = oreal;
            imag = oimag;
        }
        //template<typename T2>
         complex operator+ (complex<T> c2)
         {
            c2.real=real+c2.real;
            c2.imag=imag+c2.imag;     
            return c2;   
         }
    public:
         inline T getReal(){return real;}
         inline T getImag(){return imag;}
     private:
     
         T real;
        T imag;
         

 };

 

 namespace std
{
    template <typename T2>
    std::ostream& operator<< (std::ostream& os, const complex <T2> c)
     {
        return os<<c.getReal()<<"+"<<c.getImag()<<"i";   
     }

 }

 int main()

 {     
     complex<float> a(10,5);
     complex<float> b(2.2,6.0);
     complex<float> c=a+b;
     cout<<c<<"\n";
     return 0;

 }

报错信息:
        return os<<c.getReal()<<"+"<<c.getImag()<<"i";    discards qualifers

去掉const 就能执行,不去掉const就执行不了,求大神分析,对const的理解还不够好。
16 回复
#2
peach54602013-08-05 08:10
友情提示一下,const是一个传染型的东西
#3
rjsp2013-08-05 08:29
程序代码:
template<typename T>
class complex
{
public:
    complex( T oreal=T(), T oimage=T() ) : real_(oreal), image_(oimage)
    {
    }
    complex operator+( const complex<T>& c )
    {
        return complex( real_+c.real_, image_+c.image_ );
    }

    inline T real() const { return real_; }
    inline T image() const { return image_; }

private:
    T real_;
    T image_;
};

#include <iostream>

template <typename T>
std::ostream& operator<< (std::ostream& os, const complex<T>& c)
{
    return os << c.real() << '+' << c.image() << 'i';
}

using namespace std;

int main()
{   

    complex<double> a(10,5);
    complex<double> b(2.2,6.0);
    complex<double> c = a+b;
    cout << c << endl;

    return 0;
}
#4
纯黑色2013-08-05 10:00
回复 3楼 rjsp
大神的代码没完全看明白,只看懂了一点,"+"的操作符重载这块写的比我自己写的省内存。
但是不明白为什么要把inclue 和using namespace 的位置调整成这样呢?想知道一些原理性的东西。
还希望不吝赐教。
#5
peach54602013-08-05 10:33
include这个,没什么深意吧

你没看懂他的代码,那你看看他跟你的代码加了什么
我说过const会传染的

[ 本帖最后由 peach5460 于 2013-8-5 10:44 编辑 ]
#6
纯黑色2013-08-05 14:52
回复 5楼 peach5460
还望明示,实在看不出来加了什么,我就看到在重载"<<"的时候加了一个引用,我尝试了一下,依然编译通过不了,我用的编译环境是C-FREE 5.0.
#7
rjsp2013-08-05 15:08
回复 6楼 纯黑色
inline T getReal() const {return real;}
inline T getImag() const {return imag;}
#8
纯黑色2013-08-05 15:26
回复 7楼 rjsp
我可以理解成为数据类型不同造成的问题吗?
#9
peach54602013-08-05 15:55
回复 8楼 纯黑色
就是数据类型不同
const int 和int是两种类型
依此类推
#10
纯黑色2013-08-05 16:11
回复 9楼 peach5460
受教了。恕我愚钝,刚开始一直没理解您的提示.
#11
peach54602013-08-05 16:35
回复 10楼 纯黑色

const属性会传染
比如A(const int n)
{
B(n);
}
那么这个n传下去的时候,也要是B也要是(const int n)

而且...假设不是值类型,是对象
比如A(const object& n)
{
n.test();
}
那么,这个test函数你必须是const的
#12
纯黑色2013-08-05 16:40
回复 7楼 rjsp
const 写在函数名前面任何位置都不能编译,写在括号后面就可以正常运行,能帮我分析一下吗?拜谢.
#13
peach54602013-08-05 16:43
回复 12楼 纯黑色
那你知道写在前面和写在后面分别是什么意思吗?
如果你不知道,你为什么要问我呢,去看看书,看书上是怎么写的...

我给你个答案,你扭头就忘了...
你自己苦过,就会记得深刻了...
我只能引导你...

[ 本帖最后由 peach5460 于 2013-8-5 16:46 编辑 ]
#14
纯黑色2013-08-05 17:07
回复 13楼 peach5460
我问了半天goole,没有找到任何相对应的资料,但是看了很多关于const的介绍:
我的理解是这样的:
    通过const 修饰的变量,函数,类,类的成员函数都是不能被修改的。
举个例子:
    const int a;//a这个变量不能被修改.
    const int *a;(等价于int const *a)//a指针指向的变量不能修改.
    int *const a;//a指针的指向不能被修改.
    const int function(){}//function返回的值不能被修改.
    int function() const{}//funtion函数体里面的所有变量,函数,类都不能被修改.

因此当用const 实例化一个类的对象后,这个类的所有方法和属性都不能再被改变了.
所以类里面的非const修饰的函数体都会discard 掉.

不知道我这样理解正确吗?还望指出.

[ 本帖最后由 纯黑色 于 2013-8-5 17:15 编辑 ]
#15
纯黑色2013-08-05 17:08
回复 13楼 peach5460
您说的对啊,我深有感触,所以我现在每学一个知识点都会写一段验证代码.
#16
peach54602013-08-05 17:17
const int function(){}//function返回的值不能被修改.
    int function() const{}//funtion函数体里面的所有变量,函数,类都不能被修改.

你这个例子,涉及到这两个
const在前面,表示返回值是const
const在后面表示,在函数调用过程中不能改变成员变量的值

说回我的例子
比如A(const object& n)
{
n.test();
}
那么,这个test函数你必须是const的

这里,你的对象n是const的
所以
test必须是void text () const
这样,两个const呼应才对
#17
纯黑色2013-08-05 17:37
回复 16楼 peach5460
这样就通了,如果const 实例化一个类的对象的话,这个对象可以用的方法以及属性,必须是在这个类定义的时候用const修饰过的,否则的话就不能使用.

恍然大悟啊.
1