Jump to content

  • Log In with Google      Sign In   
  • Create Account

sigslot.h with Visual Studio (compile issue)


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
7 replies to this topic

#1 GlennNZ   Members   -  Reputation: 133

Like
0Likes
Like

Posted 12 April 2009 - 09:40 PM

I'm trying to compile an app with the the sigslot.h included in (http://sigslot.sourceforge.net/). However, I'm under the impression the Visual Stuio 2008 EE doesn't like it very much.
Quote:
Error 6 error C2146: syntax error : missing ';' before identifier 'const_iterator' Error 9 error C2146: syntax error : missing ';' before identifier 'const_iterator' Error 7 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int Error 10 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
The closest I get to someone getting a solution to this is here. http://www.gamedev.net/community/forums/topic.asp?topic_id=399191&forum_id=21&gforum_id=0 close but not close enough. Does anyone have the solution, or can offer another alternative that is as simple as what sigslot seems? (Not Boost please). Thanks.

Sponsor:

#2 Evil Steve   Members   -  Reputation: 1987

Like
0Likes
Like

Posted 12 April 2009 - 10:10 PM

What lines of code do those errors occur on?

#3 GlennNZ   Members   -  Reputation: 133

Like
0Likes
Like

Posted 12 April 2009 - 10:23 PM

Line 419; the line that looks like:
typedef sender_set::const_iterator const_iterator;

I've also tried doing #define SIGSLOT_PURE_ISO

#4 Ezbez   Crossbones+   -  Reputation: 1164

Like
0Likes
Like

Posted 12 April 2009 - 10:50 PM

I (OP in the thread you linked to) never managed to get that running. :(

#5 spookycat   Members   -  Reputation: 757

Like
0Likes
Like

Posted 12 April 2009 - 10:52 PM

You need to modify the line

typedef sender_set::const_iterator const_iterator;

as follows

typedef typename sender_set::const_iterator const_iterator;

Typename Explanation

#6 GlennNZ   Members   -  Reputation: 133

Like
0Likes
Like

Posted 12 April 2009 - 11:18 PM

Thanks spookycat, that's it exactly.

I can now finally wire these GUI buttons up with something a bit more elegant than my existing code. (then back to figuring out how all those templates work.)

Thanks again.

#7 GlennNZ   Members   -  Reputation: 133

Like
0Likes
Like

Posted 13 April 2009 - 10:51 PM

I'm running the risk of hijacking my own thread, but it seems that it isn't just VS 2008 EE that doesn't like Sarah's sigslot code. g++ (linux and mac) also doesn't like it, but I suspect for different reasons.

However, I noticed that if I use code from an article at code project (http://www.codeproject.com/KB/cpp/CppEvents.aspx), I get similar compile problems. Unfortunately my knowledge of templates and why they would cause such issues is beyond me, hence why I'm here.


The error is relating to what the std::map contains, which is more templated code.

Quote:

sigslot_test.h: In member function ‘bool CppEvent1<ReturnT, ParamT>::detach(CppEventHandler)’:
sigslot_test.h:58: error: expected `;' before ‘it’



The code looks like the following.



#include <iostream>
#include <map>
using namespace std;

typedef int CppEventHandler;

template <typename ReturnT, typename ParamT>
class EventHandlerBase1
{
public:
virtual ReturnT notify(ParamT param) = 0;
};

template <typename ListenerT, typename ReturnT, typename ParamT>
class EventHandler1 : public EventHandlerBase1<ReturnT, ParamT>
{
typedef ReturnT (ListenerT::*PtrMember)(ParamT);
ListenerT* mObject;
PtrMember mMember;

public:
EventHandler1(ListenerT* object, PtrMember member) : mObject(object), mMember(member)
{

}

ReturnT notify(ParamT param)
{
return (mObject->*mMember)(param);
}
};


template <typename ReturnT, typename ParamT>
class CppEvent1
{
typedef std::map<int, EventHandlerBase1<ReturnT, ParamT> *> HandlersMap;
HandlersMap mHandlers;
int mCount;

public:
CppEvent1() : mCount(0)
{
}

template <typename ListenerT>
CppEventHandler attach(ListenerT* object, ReturnT (ListenerT::*member)(ParamT))
{
typedef ReturnT (ListenerT::*PtrMember)(ParamT);
mHandlers[mCount] = (new EventHandler1<ListenerT, ReturnT, ParamT>(object, member));
mCount++;
return mCount-1;
}

bool detach(CppEventHandler id)
{
HandlersMap::iterator it = mHandlers.find(id);
if (it == mHandlers.end())
return false;

delete it->second;
mHandlers.erase(it);
return true;
}

ReturnT notify(ParamT param)
{
HandlersMap::iterator it = mHandlers.begin();
for (; it != mHandlers.end(); it++)
{
it->second->notify(param);
}
return true;
}


};



int main()
{
cout << "hello and welcome to yet another coding adventure\n";
}


I know there are other sigslot libraries out there, (like http://s11n.net/sigslot/) but it would be nice to know the solution to this compile issue.

Cheers.

#8 GlennNZ   Members   -  Reputation: 133

Like
0Likes
Like

Posted 14 April 2009 - 12:18 PM

As a follow up; courtesy of one of the guys at forums.devshed.com, I have a solution.

I should have added typename before HandlersMap::iterator it = mHandlers.find(id);
so that I get
typename HandlersMap::iterator it = mHandlers.find(id);
and
typename HandlersMap::iterator it = mHandlers.begin();

The devshed link is here




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS