[aspectc-user] where is the mistake ?
Olaf Spinczyk
Olaf.Spinczyk at informatik.uni-erlangen.de
Wed Aug 3 18:24:00 CEST 2005
Hi,
I am rather sure that this is a known code generation problem of ac++
0.9.3. It happens if an aspect defines an introduction into a class for
which it also defines code advice (execution and construction in your case).
You can avoid the problem by either using ac++ 0.9.2 or by using the
joinpoint API to obtain the object reference instead of using the "that"
pointcut function. By using the joinpoint API you avoid the need include
setAsTree.h.
The next ac++ version will contain a fix for this problem.
Best regards,
Olaf
MeunS Meunier wrote:
> Hi, i need help to solve this little problem.
>
> i use this command to weave my aspect : ac++.exe -c main.cc -o
> weaved-main.cc -p . -a contract.ah
>
> When i compile weaved-main.cc with cl (Visual .NET 2003), i obtain this
> error message :
>
> contract.ah(22) : error C2061: erreur de syntaxe : identificateur
> 'setAsTree'
>
> thank's in advance
>
> Sylvain Meunier
>
> ------------------------------------------------------- FILES
> ------------------------------------------------------------
>
> class header :
>
> #ifndef __SETASTREE
> #define __SETASTREE
>
> #include <iostream>
>
> class setAsTree
> {
> public:
> setAsTree(int v);
> setAsTree(const setAsTree& set);
>
> virtual ~setAsTree();
>
> setAsTree& operator=(const setAsTree& set);
>
> void insert(int v);
> setAsTree remove(int v);
>
> int min() const;
> int max() const;
> bool contains(int v) const;
>
> int val;
> setAsTree* ltree,* rtree;
>
> friend std::ostream& operator<<(std::ostream& stream,const
> setAsTree& set);
>
> private:
> void copy(const setAsTree& set);
> void destroy();
> };
>
> std::ostream& operator<<(std::ostream& stream,const setAsTree& set);
>
> #endif
>
> class sources :
> #include "./setAsTree.h"
>
> using namespace std;
>
> setAsTree::setAsTree(int v)
> {
> ltree = NULL;
> rtree = NULL;
> val = v;
> }
>
> setAsTree::setAsTree(const setAsTree& set)
> {
> copy(set);
> }
>
> setAsTree::~setAsTree()
> {
> destroy();
> }
>
> setAsTree& setAsTree::operator=(const setAsTree& set)
> {
> copy(set);
> return *this;
> }
>
> void setAsTree::insert(int v)
> {
> if(v > val)
> {
> if(rtree)
> rtree->insert(v);
> else
> rtree = new setAsTree(v);
> }
> else if(v < val)
> {
> if(ltree)
> ltree->insert(v);
> else
> ltree = new setAsTree(v);
> }
>
> }
>
> setAsTree setAsTree::remove(int v)
> {
> return *this;
> }
>
> int setAsTree::min() const
> {
> if(ltree)
> return ltree->max();
> else
> return val;
> }
>
> int setAsTree::max() const
> {
> if(rtree)
> return rtree->max();
> else
> return val;
> }
>
> bool setAsTree::contains(int v) const
> {
> if(val == val)
> return true;
> else if(v > val && rtree)
> return rtree->contains(v);
> else if(v < val && ltree)
> return ltree->contains(v);
> else
> return false;
> }
>
> void setAsTree::copy(const setAsTree& set)
> {
> if(this == &set)
> return;
>
> destroy();
>
> if(set.ltree)
> ltree = new setAsTree(*set.ltree);
> else
> ltree = NULL;
>
> if(set.rtree)
> rtree = new setAsTree(*set.rtree);
> else
> rtree = NULL;
>
> val = set.val;
> }
>
> void setAsTree::destroy()
> {
> if(rtree)
> {
> delete rtree;
> rtree = NULL;
> }
>
> if(ltree)
> {
> delete ltree;
> ltree = NULL;
> }
> }
>
> std::ostream& operator<<(std::ostream& stream,const setAsTree& set)
> {
> if(set.ltree)
> stream << *set.ltree;
>
> stream << set.val << " ";
>
> if(set.rtree)
> stream << *set.rtree;
>
> return stream;
> }
>
> the aspect:
>
> #ifndef __CONTRACT
> #define __CONTRACT
>
> #include <iostream>
> #include "./setAsTree.h"
>
> aspect contract
> {
> pointcut check_invariant(setAsTree& s) =
> (execution("% setAsTree::%(...)") || construction("setAsTree"))
> && that(s);
>
> public:
> advice check_invariant(s) : after(setAsTree& s)
> {
>
> }
>
> advice "setAsTree" : bool invariant() const
> {
> return true;
> }
> };
>
> #endif
>
> main file:
> #include "./setAsTree.h"
> #include <iostream>
>
> using namespace std;
>
> int main(int argc,char** argv)
> {
> setAsTree set(4);
>
> set.insert(2);
> set.insert(3);
> set.insert(1);
> set.insert(2);
>
> cout << set << endl;
>
> return 0;
> }
>
> -------------------------------
>
> _________________________________________________________________
> Bénéficiez de 250 Mo de stockage avec MSN Hotmail
> http://g.msn.fr/FR1001/866
>
> _______________________________________________
> aspectc-user mailing list
> aspectc-user at aspectc.org
> http://www.aspectc.org/mailman/listinfo/aspectc-user
More information about the aspectc-user
mailing list