Re: Template question
Adrian wrote:
Is the output from the following code correct?
You mean, is it OK that when you instantiate Foo<DateTime> it actually
instantiates Foo<time_t>? 'DateTime' in your program is *the synonym*
for 'time_t'. Almost like a macro. When you write 'DateTime', the
compiler actually uses 'time_t' *because you told it to*.
> Is the result
undefined?
Why would it be undefined?
> I am not quite sure what I expected from this :-).
What do you mean, exactly? How can you not be sure what you expected?
Perhaps you have forgotten what you expected, but you did expect
something specific when you were writing the code, no?
> Should
both the time_t and DateTime creation call the specialized class or
should only the time_t. Both results would make sense to me.
How can different results both make sense? It's not like the behaviour
is implementation-specific. It's very well defined.
Does it say this anywhere in the standard at all?
Not sure what your confusion is. If you declare
time_t t1;
DateTime t2; // considering 'DateTime' is your typedef
do you expect the types of 't1' and 't2' to be the same or different?
What if you have a function:
void bar(time_t);
and you call it
bar(t2);
do you expect it to work or do you expect a compiler error? If the
latter, what would be the cause of the error? If the former, and the
types are fully equivalent, why would they be different in case of
templates?
TIA
Adrian
------------------------------------
#include <iostream>
#include <ctime>
typedef time_t DateTime;
class BoringBase
{
public:
virtual ~BoringBase() {}
};
template<typename T>
class Foo : public BoringBase
{
public:
Foo() { std::cout << "Constructing run-of-the-mill Foo\n"; }
};
template<>
class Foo<time_t> : public BoringBase
{
public:
Foo() { std::cout << "Special time_t Foo\n"; }
};
int main(int /* argc */, char /* *argv[] */)
{
BoringBase *a,*b,*c;
a=new Foo<int>();
b=new Foo<time_t>();
c=new Foo<DateTime>();
return 0;
}
// Outputs:
// [adrianc@mlx32dev:~]$g++ -Wall -ansi -pedantic -Wextra -Weffc++
foo.cc
// [adrianc@mlx32dev:~]$a.out
// Constructing run-of-the-mill Foo
// Special time_t Foo
// Special time_t Foo
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask