[Assorted-commits] SF.net SVN: assorted:[1262] sandbox/trunk/src/cc/fwd.cc
Brought to you by:
yangzhang
From: <yan...@us...> - 2009-03-06 20:54:18
|
Revision: 1262 http://assorted.svn.sourceforge.net/assorted/?rev=1262&view=rev Author: yangzhang Date: 2009-03-06 20:54:16 +0000 (Fri, 06 Mar 2009) Log Message: ----------- added demo of using templates to circumvent forward declarations Added Paths: ----------- sandbox/trunk/src/cc/fwd.cc Added: sandbox/trunk/src/cc/fwd.cc =================================================================== --- sandbox/trunk/src/cc/fwd.cc (rev 0) +++ sandbox/trunk/src/cc/fwd.cc 2009-03-06 20:54:16 UTC (rev 1262) @@ -0,0 +1,57 @@ +// This doesn't work: invalid use of incomplete type. +#if 0 +struct container; +struct iter { + container &c; + int *p; + iter(container &c) : c(c), p(&c.value()) {} +}; +struct container { + int x; + int &value() { return x; } + iter begin() { return iter(*this); } +}; +int main() { + container c; + c.begin(); + return 0; +} +#endif + +// This *does* work. +template<typename T> struct container; +template<typename T> struct iter { + container<T> &c; + T *p; + iter(container<T> &c) : c(c), p(&c.value()) {} +}; +template<typename T> struct container { + T x; + T &value() { return x; } + iter<T> begin() { return iter<T>(*this); } +}; +int main() { + container<int> c; + c.begin(); + return 0; +}; + +// This doesn't work either. +#if 0 +template<typename T> struct container; +template<typename T> struct iter { + container<int> &c; + int *p; + iter(container<int> &c) : c(c), p(&c.value()) {} +}; +template<typename T> struct container { + int x; + int &value() { return x; } + iter<int> begin() { return iter<int>(*this); } +}; +int main() { + container<int> c; + c.begin(); + return 0; +} +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |