Difference between revisions of "User:Stefano CiscoSystems/Compiling Issues with Vista and MSVS2008"

From Second Life Wiki
Jump to navigation Jump to search
Line 2: Line 2:


The first error is somehow related to the search_n for the LLMessageThrottleEntry class, but i really cannot decrypt any better the compilation error then knowing the compiler cannot deduce some type.
The first error is somehow related to the search_n for the LLMessageThrottleEntry class, but i really cannot decrypt any better the compilation error then knowing the compiler cannot deduce some type.
The error happens in [yourpath]\Visual Studio 9.0\vc\include\algorithm, on line 406 (excerpt follows)
  template<class _FwdIt1,
class _Diff2,
class _Ty,
class _Pr> inline
_FwdIt1 _Search_n(_FwdIt1 _First1, _FwdIt1 _Last1,
_Diff2 _Count, const _Ty& _Val, _Pr _Pred, random_access_iterator_tag)
{ // find first _Count * _Val satisfying _Pred, random-access iterators
_DEBUG_RANGE(_First1, _Last1);
_DEBUG_POINTER(_Pred);
 
if (_Count <= 0)
return (_First1);
 
  _FwdIt1 _Oldfirst1 = _First1;
for (; _Count <= _Last1 - _Oldfirst1; )
{ // enough room, look for a match
if (_Pred(*_First1, _Val))
{ // found part of possible match, check it out
_Diff2 _Count1 = _Count;
_FwdIt1 _Mid1  = _First1;
 
406: for (; _Oldfirst1 != _First1 && _First1[-1] == _Val; --_First1)
--_Count1; // back up over any skipped prefix
 
if (_Count1 <= _Last1 - _Mid1)
for (; ; ) // enough left, test suffix
if (--_Count1 == 0)
return (_First1); // found rest of match, report it
else if (!_Pred(*++_Mid1, _Val))
break; // short match not at end
 
_Oldfirst1 = ++_Mid1; // failed match, take small jump
_First1 = _Oldfirst1;
}
else
{ // no match, take big jump and back up as needed
_Oldfirst1 = _First1 + 1;
_First1 += _Count;
}
}
return (_Last1);
}
So the problem seems to be the operator == in the equality:
_First1[-1] == _Val;
coming from the search_n operation.
They both evaluate to a
const std::deque<_Ty,_Alloc> &
which types are ambiguous for the compiler.


Here is the exact copy of the full compilation error:
Here is the exact copy of the full compilation error:
Line 85: Line 138:
   * COMPLETENESS OR PERFORMANCE.
   * COMPLETENESS OR PERFORMANCE.
   */
   */
 
 
  #include "linden_common.h"  
  #include "linden_common.h"  
  #include "llhash.h"
  #include "llhash.h"
 
 
  #include "llmessagethrottle.h"
  #include "llmessagethrottle.h"
  #include "llframetimer.h"
  #include "llframetimer.h"
 
  // This is used for the stl search_n function.
  // This is used for the stl search_n function.
   bool eq_message_throttle_entry(LLMessageThrottleEntry a, LLMessageThrottleEntry b)
   bool eq_message_throttle_entry(LLMessageThrottleEntry a, LLMessageThrottleEntry b)
   { return a.getHash() == b.getHash(); }
   { return a.getHash() == b.getHash(); }
 
 
  const U64 SEC_TO_USEC = 1000000;
  const U64 SEC_TO_USEC = 1000000;
 
 
Line 104: Line 157:
  10 * SEC_TO_USEC // MTC_AGENT_ALERT
  10 * SEC_TO_USEC // MTC_AGENT_ALERT
  };
  };
 
 
  LLMessageThrottle::LLMessageThrottle()
  LLMessageThrottle::LLMessageThrottle()
  {
  {
  }
  }
 
 
  LLMessageThrottle::~LLMessageThrottle()
  LLMessageThrottle::~LLMessageThrottle()
  {
  {
  }
  }
 
 
  void LLMessageThrottle::pruneEntries()
  void LLMessageThrottle::pruneEntries()
  {
  {
Line 120: Line 173:
  {
  {
  message_list_t* message_list = &(mMessageList[cat]);
  message_list_t* message_list = &(mMessageList[cat]);
 
 
  // Use a reverse iterator, since entries on the back will be the oldest.
  // Use a reverse iterator, since entries on the back will be the oldest.
  message_list_reverse_iterator_t r_iterator = message_list->rbegin();
  message_list_reverse_iterator_t r_iterator = message_list->rbegin();
  message_list_reverse_iterator_t r_last = message_list->rend();
  message_list_reverse_iterator_t r_last = message_list->rend();
 
 
  // Look for the first entry younger than the maximum age.
  // Look for the first entry younger than the maximum age.
  F32 max_age = (F32)MAX_MESSAGE_AGE[cat];  
  F32 max_age = (F32)MAX_MESSAGE_AGE[cat];  
Line 134: Line 187:
  // We found a young enough entry.
  // We found a young enough entry.
  found = TRUE;
  found = TRUE;
 
 
  // Did we find at least one entry to remove?
  // Did we find at least one entry to remove?
  if (r_iterator != message_list->rbegin())
  if (r_iterator != message_list->rbegin())
Line 147: Line 200:
  }
  }
  }
  }
 
 
  // If we didn't find any entries young enough to keep, remove them all.
  // If we didn't find any entries young enough to keep, remove them all.
  if (!found)
  if (!found)
Line 155: Line 208:
  }
  }
  }
  }
 
 
  BOOL LLMessageThrottle::addViewerAlert(const LLUUID& to, const char* mesg)
  BOOL LLMessageThrottle::addViewerAlert(const LLUUID& to, const char* mesg)
  {
  {
  message_list_t* message_list = &(mMessageList[MTC_VIEWER_ALERT]);
  message_list_t* message_list = &(mMessageList[MTC_VIEWER_ALERT]);
 
 
  // Concatenate from,to,mesg into one string.
  // Concatenate from,to,mesg into one string.
  std::ostringstream full_mesg;
  std::ostringstream full_mesg;
  full_mesg << to << mesg;
  full_mesg << to << mesg;
 
 
  // Create an entry for this message.
  // Create an entry for this message.
  size_t hash = llhash<const char*> (full_mesg.str().c_str());
  size_t hash = llhash<const char*> (full_mesg.str().c_str());
  LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime());
  LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime());
 
 
  // Check if this message is already in the list.
  // Check if this message is already in the list.
  /*
  /*
Line 174: Line 227:
  */
  */
  message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(), 1, entry, eq_message_throttle_entry);
  message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(), 1, entry, eq_message_throttle_entry);
 
 
  if (found == message_list->end())
  if (found == message_list->end())
  {
  {
Line 187: Line 240:
  }
  }
  }
  }
 
 
  BOOL LLMessageThrottle::addAgentAlert(const LLUUID& agent, const LLUUID& task, const char* mesg)
  BOOL LLMessageThrottle::addAgentAlert(const LLUUID& agent, const LLUUID& task, const char* mesg)
  {
  {
  message_list_t* message_list = &(mMessageList[MTC_AGENT_ALERT]);
  message_list_t* message_list = &(mMessageList[MTC_AGENT_ALERT]);
 
 
  // Concatenate from,to,mesg into one string.
  // Concatenate from,to,mesg into one string.
  std::ostringstream full_mesg;
  std::ostringstream full_mesg;
  full_mesg << agent << task << mesg;
  full_mesg << agent << task << mesg;
 
 
  // Create an entry for this message.
  // Create an entry for this message.
  size_t hash = llhash<const char*> (full_mesg.str().c_str());
  size_t hash = llhash<const char*> (full_mesg.str().c_str());
  LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime());
  LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime());
 
 
  // Check if this message is already in the list.
  // Check if this message is already in the list.
  /* stefano i commented the following so to get one only error while debugging */
  /* stefano i commented the following so to get one only error while debugging */
  /* message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(),
  /* message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(),  
  1, entry, eq_message_throttle_entry);
                                                      1, entry, eq_message_throttle_entry);  
 
 
 
  if (found == message_list->end())
  if (found == message_list->end())
  {
  {
Line 218: Line 270:
  }
  }
  */
  */
 
 
  }
  }

Revision as of 00:34, 11 October 2007

could not deduce template argument from 'LLMessageThrottleEntry' in llmessagethrottle.cpp

The first error is somehow related to the search_n for the LLMessageThrottleEntry class, but i really cannot decrypt any better the compilation error then knowing the compiler cannot deduce some type.

The error happens in [yourpath]\Visual Studio 9.0\vc\include\algorithm, on line 406 (excerpt follows)

 template<class _FwdIt1,
	class _Diff2,
	class _Ty,
	class _Pr> inline
	_FwdIt1 _Search_n(_FwdIt1 _First1, _FwdIt1 _Last1,
		_Diff2 _Count, const _Ty& _Val, _Pr _Pred, random_access_iterator_tag)
	{	// find first _Count * _Val satisfying _Pred, random-access iterators
	_DEBUG_RANGE(_First1, _Last1);
	_DEBUG_POINTER(_Pred);
 
	if (_Count <= 0)
		return (_First1);
 
 	_FwdIt1 _Oldfirst1 = _First1;
	for (; _Count <= _Last1 - _Oldfirst1; )
		{	// enough room, look for a match 
		if (_Pred(*_First1, _Val))
			{	// found part of possible match, check it out
			_Diff2 _Count1 = _Count;
			_FwdIt1 _Mid1  = _First1;
 
406:			for (; _Oldfirst1 != _First1 && _First1[-1] == _Val; --_First1)
				--_Count1;	// back up over any skipped prefix
 
			if (_Count1 <= _Last1 - _Mid1)
				for (; ; )	// enough left, test suffix
					if (--_Count1 == 0)
						return (_First1);	// found rest of match, report it
					else if (!_Pred(*++_Mid1, _Val))
						break;	// short match not at end
 
			_Oldfirst1 = ++_Mid1;	// failed match, take small jump
			_First1 = _Oldfirst1;
			}
		else
			{	// no match, take big jump and back up as needed
			_Oldfirst1 = _First1 + 1;
			_First1 += _Count;
			}
		}
	return (_Last1);
	}

So the problem seems to be the operator == in the equality:

_First1[-1] == _Val; 

coming from the search_n operation.

They both evaluate to a

const std::deque<_Ty,_Alloc> &

which types are ambiguous for the compiler.

Here is the exact copy of the full compilation error:

1>------ Build started: Project: llmessage, Configuration: Debug Win32 ------
1>Compiling...
1>llmessagethrottle.cpp
1>c:\sources\secondlife\lindenlabclient\indra\llmessage\llmessagethrottle.cpp(134) : warning C4189: 'message_list' : local variable is initialized but not referenced
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2784: 'bool std::operator ==(const std::deque<_Ty,_Alloc> &,const std::deque<_Ty,_Alloc> &)' : could not deduce template argument for 'const std::deque<_Ty,_Alloc> &' from 'LLMessageThrottleEntry'
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\deque(1341) : see declaration of 'std::operator =='
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(435) : see reference to function template instantiation '_FwdIt1 std::_Search_n<_FwdIt1,_Diff2,_Ty,bool(__cdecl *)(LLMessageThrottleEntry,LLMessageThrottleEntry)>(_FwdIt1,_FwdIt1,_Diff2,const _Ty &,_Pr,std::random_access_iterator_tag)' being compiled
1>        with
1>        [
1>            _FwdIt1=LLMessageThrottle::message_list_iterator_t,
1>            _Diff2=int,
1>            _Ty=LLMessageThrottleEntry,
1>            _Pr=bool (__cdecl *)(LLMessageThrottleEntry,LLMessageThrottleEntry)
1>        ]
1>        c:\sources\secondlife\lindenlabclient\indra\llmessage\llmessagethrottle.cpp(117) : see reference to function template instantiation '_FwdIt1 std::search_n<LLMessageThrottle::message_list_iterator_t,int,LLMessageThrottleEntry,bool(__cdecl *)(LLMessageThrottleEntry,LLMessageThrottleEntry)>(_FwdIt1,_FwdIt1,_Diff2,const _Ty &,_Pr)' being compiled
1>        with
1>        [
1>            _FwdIt1=LLMessageThrottle::message_list_iterator_t,
1>            _Diff2=int,
1>            _Ty=LLMessageThrottleEntry,
1>            _Pr=bool (__cdecl *)(LLMessageThrottleEntry,LLMessageThrottleEntry)
1>        ]
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2784: 'bool std::operator ==(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)' : could not deduce template argument for 'const std::list<_Ty,_Ax> &' from 'LLMessageThrottleEntry'
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\list(1299) : see declaration of 'std::operator =='
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2784: 'bool std::operator ==(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : could not deduce template argument for 'const std::_Tree<_Traits> &' from 'LLMessageThrottleEntry'
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\xtree(1459) : see declaration of 'std::operator =='
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2784: 'bool std::operator ==(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'LLMessageThrottleEntry'
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\string(90) : see declaration of 'std::operator =='
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2784: 'bool std::operator ==(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const _Elem *' from 'LLMessageThrottleEntry'
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\string(80) : see declaration of 'std::operator =='
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2784: 'bool std::operator ==(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'LLMessageThrottleEntry'
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\string(70) : see declaration of 'std::operator =='
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2784: 'bool std::operator ==(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : could not deduce template argument for 'const std::vector<_Ty,_Alloc> &' from 'LLMessageThrottleEntry'
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\vector(1309) : see declaration of 'std::operator =='
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2784: 'bool std::operator ==(const std::istream_iterator<_Ty,_Elem,_Traits,_Diff> &,const std::istream_iterator<_Ty,_Elem,_Traits,_Diff> &)' : could not deduce template argument for 'const std::istream_iterator<_Ty,_Elem,_Traits,_Diff> &' from 'LLMessageThrottleEntry'
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\iterator(266) : see declaration of 'std::operator =='
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2784: 'bool std::operator ==(const std::istreambuf_iterator<_Elem,_Traits> &,const std::istreambuf_iterator<_Elem,_Traits> &)' : could not deduce template argument for 'const std::istreambuf_iterator<_Elem,_Traits> &' from 'LLMessageThrottleEntry'
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\streambuf(548) : see declaration of 'std::operator =='
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2784: 'bool std::operator ==(const std::allocator<_Ty> &,const std::allocator<_Other> &) throw()' : could not deduce template argument for 'const std::allocator<_Ty> &' from 'LLMessageThrottleEntry'
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\xmemory(173) : see declaration of 'std::operator =='
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2784: 'bool std::operator ==(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'LLMessageThrottleEntry'
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\xutility(2193) : see declaration of 'std::operator =='
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2784: 'bool std::operator ==(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : could not deduce template argument for 'const std::_Revranit<_RanIt,_Base> &' from 'LLMessageThrottleEntry'
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\xutility(2007) : see declaration of 'std::operator =='
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2784: 'bool std::operator ==(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'LLMessageThrottleEntry'
1>        c:\program files\development\microsoft visual studio 9.0\vc\include\utility(68) : see declaration of 'std::operator =='
1>c:\program files\development\microsoft visual studio 9.0\vc\include\algorithm(406) : error C2676: binary '==' : 'LLMessageThrottleEntry' does not define this operator or a conversion to a type acceptable to the predefined operator
1>Build log was saved at "file://c:\Sources\SecondLife\LindenLabClient\indra\llmessage\Debug\BuildLog.htm"
1>llmessage - 14 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

And this is the content of the file llmessagethrottle.cpp that i am using:

/** 
 * @file llmessagethrottle.cpp
 * @brief LLMessageThrottle class used for throttling messages.
 *
 * Copyright (c) 2004-2007, Linden Research, Inc.
 * 
 * Second Life Viewer Source Code
 * The source code in this file ("Source Code") is provided by Linden Lab
 * to you under the terms of the GNU General Public License, version 2.0
 * ("GPL"), unless you have obtained a separate licensing agreement
 * ("Other License"), formally executed by you and Linden Lab.  Terms of
 * the GPL can be found in doc/GPL-license.txt in this distribution, or
 * online at http://secondlife.com/developers/opensource/gplv2
 * 
 * There are special exceptions to the terms and conditions of the GPL as
 * it is applied to this Source Code. View the full text of the exception
 * in the file doc/FLOSS-exception.txt in this software distribution, or
 * online at http://secondlife.com/developers/opensource/flossexception
 * 
 * By copying, modifying or distributing this software, you acknowledge
 * that you have read and understood your obligations described above,
 * and agree to abide by those obligations.
 * 
 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 * COMPLETENESS OR PERFORMANCE.
 */
 
#include "linden_common.h" 
#include "llhash.h"
 
#include "llmessagethrottle.h"
#include "llframetimer.h"
  
// This is used for the stl search_n function.
 bool eq_message_throttle_entry(LLMessageThrottleEntry a, LLMessageThrottleEntry b)
 		{ return a.getHash() == b.getHash(); }
 
const U64 SEC_TO_USEC = 1000000;
		
// How long (in microseconds) each type of message stays in its throttle list.
const U64 MAX_MESSAGE_AGE[MTC_EOF] =
{
	10 * SEC_TO_USEC,	// MTC_VIEWER_ALERT
	10 * SEC_TO_USEC	// MTC_AGENT_ALERT
};
 
LLMessageThrottle::LLMessageThrottle()
{
}
 
LLMessageThrottle::~LLMessageThrottle()
{
}
 
void LLMessageThrottle::pruneEntries()
{
	// Go through each message category, and prune entries older than max age.
	S32 cat;
	for (cat = 0; cat < MTC_EOF; cat++)
	{
		message_list_t* message_list = &(mMessageList[cat]);
 
		// Use a reverse iterator, since entries on the back will be the oldest.
		message_list_reverse_iterator_t r_iterator 	= message_list->rbegin();
		message_list_reverse_iterator_t r_last 		= message_list->rend();
 
		// Look for the first entry younger than the maximum age.
		F32 max_age = (F32)MAX_MESSAGE_AGE[cat]; 
		BOOL found = FALSE;
		while (r_iterator != r_last && !found)
		{
			if ( LLFrameTimer::getTotalTime() - (*r_iterator).getEntryTime() < max_age )
			{
				// We found a young enough entry.
				found = TRUE;
 
				// Did we find at least one entry to remove?
				if (r_iterator != message_list->rbegin())
				{
					// Yes, remove it.
					message_list->erase(r_iterator.base(), message_list->end());
				}
			}
			else
			{
				r_iterator++;
			}
		}
 
		// If we didn't find any entries young enough to keep, remove them all.
		if (!found)
		{
			message_list->clear();
		}
	}
}
 
BOOL LLMessageThrottle::addViewerAlert(const LLUUID& to, const char* mesg)
{
	message_list_t* message_list = &(mMessageList[MTC_VIEWER_ALERT]);
 
	// Concatenate from,to,mesg into one string.
	std::ostringstream full_mesg;
	full_mesg << to << mesg;
 
	// Create an entry for this message.
	size_t hash = llhash<const char*> (full_mesg.str().c_str());
	LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime());
 
	// Check if this message is already in the list.
	/*
        * Stefano: i did try using this but did not help: 
	<message_list_iterator_t,int,LLMessageThrottleEntry,bool (__cdecl *)(LLMessageThrottleEntry,LLMessageThrottleEntry)>
	*/
	message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(), 1, entry, eq_message_throttle_entry);
 
	if (found == message_list->end())
	{
		// This message was not found.  Add it to the list.
		message_list->push_front(entry);
		return TRUE;
	}
	else
	{
		// This message was already in the list.
		return FALSE;
	}
}
  
BOOL LLMessageThrottle::addAgentAlert(const LLUUID& agent, const LLUUID& task, const char* mesg)
{
	message_list_t* message_list = &(mMessageList[MTC_AGENT_ALERT]);
 
	// Concatenate from,to,mesg into one string.
	std::ostringstream full_mesg;
	full_mesg << agent << task << mesg;
 
	// Create an entry for this message.
	size_t hash = llhash<const char*> (full_mesg.str().c_str());
	LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime());
 
	// Check if this message is already in the list.
/* stefano i commented the following so to get one only error while debugging */
/*	message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(), 
                                                     1, entry, eq_message_throttle_entry);    	
 
	if (found == message_list->end())
	{
		// This message was not found.  Add it to the list.
		message_list->push_front(entry);
		return TRUE;
	}
	else
	{
		// This message was already in the list.
		return FALSE;
	}
	*/
 
}