By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,820 Members | 1,189 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,820 IT Pros & Developers. It's quick & easy.

template type problem in msvc. and more

P: n/a
I have some questions about template and c++ itself.

/////////////////////////////////////////////////////////////////////////
q1) see follow c++ code, and compile. it's works only IntelC++8.1 but
VC71.
Do you know why? Which compiler's activity is C++STANDARD? And I wanna
be
feed back some explain. :)

//-----------------------------------------------------------------------
//
// COMPILER_TEST!,
//
// a) VC71 fail to compile
// b) IC81 OK
//
//-----------------------------------------------------------------------
template < typename MY_TYPE_ >
class TestClass1
{
public:
typedef int TEST_TYPE;
};

template < typename MY_TYPE_ >
class TestClass2
{
public:
typedef MY_TYPE_ MY_TYPE;
typedef TestClass1<MY_TYPE> TEST_CLASS1;
typedef TestClass2<MY_TYPE> TEST_CLASS2;
typedef typename TEST_CLASS1::TEST_TYPE TEST_TYPE1;
//typename TestClass2<MY_TYPE_>:: // this make msvc happy, but I dont
know why!
TEST_TYPE1 TestMethod1();

//
// consequently,
// a) typename TestClass2<MY_TYPE_>::TEST_TYPE1
// and
// b) TEST_TYPE1
//
// is different type! why? its the same type!
//
// i think its result due to the "typename"
//

void TestMethod2( TEST_TYPE1 a );
};

/* this will emit error in MSVC */
template < typename MY_TYPE_ >
typename TestClass2<MY_TYPE_>::TEST_TYPE1 /* return type; return type
can not use types in TestClass2
it have to specify TestClass2 scope to compile*/
TestClass2<MY_TYPE_>::TestMethod1()
{
printf( "typename TestClass2<MY_TYPE_>::TEST_TYPE1
TestClass2<MY_TYPE_>::TestMethod1() - called.\r\n" );
return 0;
}

/* this is ok */
template < typename MY_TYPE_ >
void
TestClass2<MY_TYPE_>::TestMethod2(
//typename TestClass2<MY_TYPE_>:: //this var is on scope of
TestClass2, it can use types in TestClass2
TEST_TYPE1 a
)
{
return 0;
}
void test_2()
{
TestClass2<int> a;
a.TestMethod1();
}
//---------END_OF_CODE

/////////////////////////////////////////////////////////////////////////
q2)
code:
//-- start of code
class TestCalss3
{
public:
typedef int TEST_TYPE3;
TEST_TYPE3 TestMethod3( TEST_TYPE3 a );
};

inline
TestCalss3::TEST_TYPE3 TestCalss3::TestMethod3( TEST_TYPE3 a )
{
return 1;
}
//-- end of code

Why c++ standard make difference between 'RETURN type' and 'ARGUMENT
type'?
I think 'new code1' or 'new code2' is looks better. Or I omit some
important point(s) about c++ design or compiler design?

//-- new code1
inline
TEST_TYPE3 TestCalss3::TestMethod3( TEST_TYPE3 a )
{
return 1;
}
//-- new code2
inline
TestCalss3::TEST_TYPE3 TestCalss3::TestMethod3( TestCalss3::TEST_TYPE3
a )
{
return 1;
}
//--

/////////////////////////////////////////////////////////////////////////
I'll expect good reply. Thank you in advance.
ps excuse my BAD english :) I'm not native writer :0
Jul 23 '05 #1
Share this Question
Share on Google+
1 Reply


P: n/a

icedac wrote:
I have some questions about template and c++ itself.

///////////////////////////////////////////////////////////////////////// q1) see follow c++ code, and compile. it's works only IntelC++8.1 but
VC71.
Do you know why? Which compiler's activity is C++STANDARD? And I wanna be
feed back some explain. :)

//----------------------------------------------------------------------- //
// COMPILER_TEST!,
//
// a) VC71 fail to compile
// b) IC81 OK
//
//----------------------------------------------------------------------- template < typename MY_TYPE_ >
class TestClass1
{
public:
typedef int TEST_TYPE;
};

template < typename MY_TYPE_ >
class TestClass2
{
public:
typedef MY_TYPE_ MY_TYPE;
typedef TestClass1<MY_TYPE> TEST_CLASS1;
typedef TestClass2<MY_TYPE> TEST_CLASS2;
typedef typename TEST_CLASS1::TEST_TYPE TEST_TYPE1;
//typename TestClass2<MY_TYPE_>:: // this make msvc happy, but I dont know why!
TEST_TYPE1 TestMethod1(); I think it is a problem in VC. IMHO, those definitions are equivalent.

//
// consequently,
// a) typename TestClass2<MY_TYPE_>::TEST_TYPE1
// and
// b) TEST_TYPE1
//
// is different type! why? its the same type!
//
// i think its result due to the "typename"
// Don't know. Maybe you should post those questions also in a VC related
newsgroup.

void TestMethod2( TEST_TYPE1 a );
};

/* this will emit error in MSVC */
template < typename MY_TYPE_ >
typename TestClass2<MY_TYPE_>::TEST_TYPE1 /* return type; return type
can not use types in TestClass2
it have to specify TestClass2 scope to compile*/
TestClass2<MY_TYPE_>::TestMethod1()
{
printf( "typename TestClass2<MY_TYPE_>::TEST_TYPE1
TestClass2<MY_TYPE_>::TestMethod1() - called.\r\n" );
return 0;
}

/* this is ok */
template < typename MY_TYPE_ >
void
TestClass2<MY_TYPE_>::TestMethod2(
//typename TestClass2<MY_TYPE_>:: //this var is on scope of
TestClass2, it can use types in TestClass2
TEST_TYPE1 a
)
{
return 0;
}
Hm, it doesn't look ok. The method has void type as return type, but
you return 0. I know that VC is silent about that, but it should say
something, at least a warning.

void test_2()
{
TestClass2<int> a;
a.TestMethod1();
}
//---------END_OF_CODE

///////////////////////////////////////////////////////////////////////// q2)
code:
//-- start of code
class TestCalss3
{
public:
typedef int TEST_TYPE3;
TEST_TYPE3 TestMethod3( TEST_TYPE3 a );
};

inline
TestCalss3::TEST_TYPE3 TestCalss3::TestMethod3( TEST_TYPE3 a )
{
return 1;
} Here I don't know how real 'a' type is deduced (there is no such type
in global namespace). Well, I'll search a little :). Comeau online also
compile fine this method implementation.
//-- end of code

Why c++ standard make difference between 'RETURN type' and 'ARGUMENT
type'?
I think 'new code1' or 'new code2' is looks better. Or I omit some
important point(s) about c++ design or compiler design?

//-- new code1
inline
TEST_TYPE3 TestCalss3::TestMethod3( TEST_TYPE3 a )
{
return 1;
} Not correct, as I said there isn't such a type in the global namespace
(equivalent with TestCalss3::TEST_TYPE3, eg. typedef
TestCalss3::TEST_TYPE3 TEST_TYPE3).
//-- new code2
inline
TestCalss3::TEST_TYPE3 TestCalss3::TestMethod3( TestCalss3::TEST_TYPE3 a )
{
return 1;
}
//--
This is ok :).

..
..
Best regards,
Bogdan Sintoma

Jul 23 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.