Difference between revisions of "User:Stefano CiscoSystems/Compiling Issues with Vista and MSVS2008"
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); | |||
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; } */ }