[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference turris::c_plus_plus

Title:C++
Notice:Read 1.* and use keywords (e.g. SHOW KEY/FULL KIT_CXX_VAX_VMS)
Moderator:DECCXX::AMARTIN
Created:Fri Nov 06 1987
Last Modified:Thu Jun 05 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:3604
Total number of notes:18242

3537.0. "More C++ compilation problems." by IOSG::HARDIE () Fri Apr 11 1997 15:51

	Some more compilation problems with the STL I've had with porting
	from NT is with the following code.  Again I can't see what I'm
	doing wrong, so has anyone got any ideas.

	#include <list>

	class X
	{
	public:
     		X();
        	void func(const X& otherX);
	private:
        	list<int> m_values;
	};

	X::X()
	{
	        m_values.push_back(1);
	}

	void X::func(const X& otherX)
	{
        	list<int>::iterator current;

        	current = otherX.m_values.begin();
	}

	main(void)
	{
        	X first;
        	X second;

        	first.func(second);
	}

	The error I get from DEC C++ V5.4-010 on OpenVMS VAX V6.2 is:

	        current = otherX.m_values.begin();
        ..................^
%CXX-E-NOCONVERTCLS, In this statement, "otherX.m_values.begin()" has a class
 type and cannot be converted to a class type that is incompatible.
                At line number 21 in USER1:[HARDIE.SOURCES]TMP2.CXX;1.

        }
%VCG-I-NOBJECT, No object file produced.
                At line number 30 in USER1:[HARDIE.SOURCES]TMP2.CXX;1.

%VCG-I-SUMMARY, Completed with 1 error(s), 0 warning(s), and
                1 informational messages.
                At line number 30 in USER1:[HARDIE.SOURCES]TMP2.CXX;1.

	Thanks,

	Neil
	----
T.RTitleUserPersonal
Name
DateLines
3537.1The iterator has to be constDECC::J_WARDFri Apr 11 1997 16:2330
In X::func() the type of otherX is const. 

Therefore otherX.m_values.begin() will return
a const_iterator not an iterator. A const_iterator
will not allow you to change the values inside otherX.

Change:

list<int>::iterator current;

to

list<int>::const_iterator current;

and it will compile (BTW, because of automatic instantiation
restrictions the declaration and definitions of X should be in its 
own header file...)

BTW, our 6.0 compiler will give you a better error message:

cosf.zko.dec.com> $CEXE/deccxx_driver -I$HOME/RWEDG2/dec_stdlib/cms_headers t.cx
x
cxx: Error: X.h, line 19: no suitable user-defined conversion from "list<in
t, allocator<int>>::const_iterator" to "const list<int, allocator
<int>>::iterator" exists
                current = otherX.m_values.begin();
------------------------------------------^
1 error detected in the compilation of "t.cxx".