This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: vector<MyTemplate<MyClass>> not possible?
Hallo,
you try to use a non-const method on a constant object ...
On Friday 20 September 2002 00:29, Evert, F.K. van wrote:
> When I put instances of a template-derived class in a STL vector, g++ gives
> me the following error message (Cygwin/g++3.2 as well as
> Suse8.0/g++2.95.3):
>
> /usr/include/c++/3.2/bits/stl_construct.h:78: passing `const SmartPtr<CX>'
> as
> `this' argument of `SmartPtr<T>::operator T*() [with T = CX]' discards
> qualifiers
>
> I have seen similar error messages reported about auto_ptr derived classes
> in STL containers, but my template class seems to have all the required
> methods.
>
> The code below compiles and runs fine with VC++ and BC++ (Kylix3/Suse8.0).
> I would greatly appreciate any help that you can offer.
>
> Regards,
>
> Frits
>
> ===== main file ===========================================================
> #include <stdio.h>
> #include <vector>
>
> template <class T> class SmartPtr
> {
> private:
> T* m_pI;
> public:
>
> SmartPtr(T* p = NULL)
> {
> m_pI = p;
> if (m_pI != NULL)
> m_pI->AddRef();
> }
>
> ~SmartPtr()
> {
> if (m_pI != NULL)
> {
> T* old = m_pI;
> m_pI = NULL;
> old->Release();
> }
> }
>
> SmartPtr(const SmartPtr& r) throw()
> {
> m_pI = r.m_pI;
> if (m_pI != NULL)
> m_pI->AddRef();
> }
>
> SmartPtr& operator=(const SmartPtr& lp)
> {
> if (m_pI != lp.m_pI)
> {
> T* pOld = m_pI ;
> m_pI = lp.m_pI ;
> if (m_pI != NULL)
> {
> m_pI->AddRef() ;
> }
> if (pOld != NULL)
> {
> pOld->Release() ;
> }
> }
> return *this;
> }
>
> T* operator->() { return m_pI; }
> T** operator&() { return &m_pI ;}
> T& operator*() { return *m_pI; }
> operator T*() { return m_pI ;}
Try: 'operator T*() const { return m_pl; };'
This works because you return a copy of the pointer.
>
> };
>
> class CX {
> public:
> CX() { printf("CX::CX()\n"); cnt = 0; }
> ~CX() { printf("CX::~CX()\n"); }
> void AddRef() { ++cnt; }
> void Release() { --cnt; if (cnt==0) delete this; }
> private:
> long cnt;
> };
>
> typedef SmartPtr<CX> XPtr;
>
> int main()
> {
> CX* px = new CX();
> XPtr sp(px);
> std::vector<XPtr> v;
> v.push_back(sp); // THIS IS THE LINE THAT OFFENDS G++
> return 0;
> }
>
>
> F.K. van Evert
> Plant Research International
> Phone (+31) 317-475957, Fax -423110