S
syang8
Hi all,
I'd like to ask the reason the following code works. Original, I
expected that there is going to be a "function redefinition" error.
Could anyone tell me whether this is a compiler specific (I am using
GNU g++ 4.3.4) issue or this actually conforms to the C++ standard? I
appreciate.
A function f is defined in a template class A. Class B inherited from
A<int> redefines the function f in A<int>. The output shows that the
definition f in A<int> is actually changed, while the other instance
of the template, e.g. A<float>, remains untouched.
//===================================
#include <iostream>
template<class T>
class A
{
public:
typedef A<T> BaseT;
int f();
};
template<class T>
int A<T>::f()
{
return 1;
}
class B : public A<int>
{
};
template<>
int
B::BaseT::f()
{
return 3;
}
int main()
{
A<int> a1;
A<float> a2;
B b;
std::cout << a1.f() << std::endl;
std::cout << a2.f() << std::endl;
std::cout << b.f() << std::endl;
}
// ======================================
// The output of the program is
// 3
// 1
// 3
I'd like to ask the reason the following code works. Original, I
expected that there is going to be a "function redefinition" error.
Could anyone tell me whether this is a compiler specific (I am using
GNU g++ 4.3.4) issue or this actually conforms to the C++ standard? I
appreciate.
A function f is defined in a template class A. Class B inherited from
A<int> redefines the function f in A<int>. The output shows that the
definition f in A<int> is actually changed, while the other instance
of the template, e.g. A<float>, remains untouched.
//===================================
#include <iostream>
template<class T>
class A
{
public:
typedef A<T> BaseT;
int f();
};
template<class T>
int A<T>::f()
{
return 1;
}
class B : public A<int>
{
};
template<>
int
B::BaseT::f()
{
return 3;
}
int main()
{
A<int> a1;
A<float> a2;
B b;
std::cout << a1.f() << std::endl;
std::cout << a2.f() << std::endl;
std::cout << b.f() << std::endl;
}
// ======================================
// The output of the program is
// 3
// 1
// 3