[Bug c++/29266] Rule that binding rvalue to a refernce need a copy ctor don't work
--- Comment #6 from yuanfei8077 at gmail dot com 2006-10-02 14:19 --- Subject: Re: Rule that binding rvalue to a refernce need a copy ctor don't work Thank you Andrew, appreciate your help on this topic. -Kelvin On 1 Oct 2006 20:33:33 -, pinskia at gcc dot gnu dot org [EMAIL PROTECTED] wrote: --- Comment #5 from pinskia at gcc dot gnu dot org 2006-10-01 20:33 --- (In reply to comment #3) Plesae seee Comment #2 From Kelvin 2006-09-28 23:25 [reply]. In addition 2 questions I raised in the Commet2. I also have one more question about the rule bind an rvalue to a reference, we need to let copy ctor of the class be accessible., I found that this rule only effective when the reference is delcared as const , but if we remove keyword const, then no matching happen again. Because it will not be a copy constructor that can bind a rvalue to a reference at that point so this is still not a bug. -- pinskia at gcc dot gnu dot org changed: What|Removed |Added Status|UNCONFIRMED |RESOLVED Resolution||INVALID http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29266 --- You are receiving this mail because: --- You reported the bug, or are watching the reporter. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29266
[Bug c++/29266] New: Rule that binding rvalue to a refernce need a copy ctor don't work
Hi, I used to open a issue at http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29261 and it's closed as no a bug. Also it says that to bind an rvalue to a reference, we need to let copy ctor of the class be accessible. However, I found that this is not the case when the invokcation is happen in intialization list. See below reproduction code and error message. Env: = G++ 4.1 No compile option is used Source code: == using std::cout; using std::endl; class MemPool { public: MemPool(){}; protected: MemPool(const MemPool mempool); }; template class Type class MemAllocator{ public: MemAllocator(MemPool pool):m_pool(pool){} MemPool get_pool() const { return m_pool; } templateclass OtherType MemAllocatorType operator=(const MemAllocatorOtherType rhs){ m_pool = rhs.get_pool(); return *this; } MemAllocator operator=(const MemAllocator rhs){ m_pool = rhs.get_pool(); return *this; } MemAllocator(const MemAllocator other) : m_pool(other.m_pool) {} templateclass OtherType MemAllocator(const MemAllocatorOtherType other) : m_pool(other.get_pool()) {} private: MemAllocator(); // MemAllocator(const MemAllocator); MemPool m_pool; }; template class _AllocType class tdat_hash_map { public: typedef _AllocType _Alloc; static void func(const _Alloc) {}; _Alloc malloc; private: tdat_hash_map(); }; class CacheManager { public: typedef tdat_hash_mapMemAllocatorint Map; Map caches; MemPool pool; CacheManager():caches(MemAllocatorint(pool)){}; }; Error message: == main.cpp: In constructor CacheManager::CacheManager() main.cpp:56: error: no matching function for call to tdat_hash_mapMemAllocatorint ::tdat_hash_map(MemAllocatorint)main.cpp:49: note: candidates are: tdat_hash_map_AllocType::tdat_hash_map() [with _AllocType = MemAllocatorint] main.cpp:42: note: tdat_hash_mapMemAllocatorint ::tdat_hash_map(const tdat_hash_mapMemAllocatorint ) -- Summary: Rule that binding rvalue to a refernce need a copy ctor don't work Product: gcc Version: 4.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: yuanfei8077 at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29266
[Bug c++/29266] Rule that binding rvalue to a refernce need a copy ctor don't work
--- Comment #2 from yuanfei8077 at gmail dot com 2006-09-28 23:25 --- Subject: Re: Rule that binding rvalue to a refernce need a copy ctor don't work Hi Andrew, You are right, I am omitting the code, however, my question is: 1) t.cc:38: error: 'MemAllocatorType::MemAllocator() [with Type = int]' is private t.cc:49: error: within this context However, MemAllocator is only invoked by class data member cache's intialization list, and MemAllocator's copy constructor is already provided, so you mean I am forced to offer default constructor too to make it pass, right ? 2) There is no tdat_hash_map(_Alloc) in the sources. ::tdat_hash_map(MemAllocatorint)main.cpp:49: note: candidates are: tdat_hash_map_AllocType::tdat_hash_map() [with _AllocType = MemAllocatorint] main.cpp:42: note: tdat_hash_mapMemAllocatorint ::tdat_hash_map(const tdat_hash_mapMemAllocatorint ) But from the original error output, comiler have added a default tdat_hash_map in line 42, and its format is same as what you added to make no matching error disappear. Can you explain explain why the default can't work ? Thanks for your help! -Kelvin On 28 Sep 2006 13:39:16 -, pinskia at gcc dot gnu dot org [EMAIL PROTECTED] wrote: --- Comment #1 from pinskia at gcc dot gnu dot org 2006-09-28 13:39 --- There is no tdat_hash_map(_Alloc) in the sources. Adding one makes it get past that error and then we get: t.cc: In constructor 'tdat_hash_map_AllocType::tdat_hash_map(const _AllocType) [with _AllocType = MemAllocatorint]': t.cc:64: instantiated from here t.cc:38: error: 'MemAllocatorType::MemAllocator() [with Type = int]' is private t.cc:49: error: within this context So this is invalid still. -- pinskia at gcc dot gnu dot org changed: What|Removed |Added Status|UNCONFIRMED |RESOLVED Resolution||INVALID http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29266 --- You are receiving this mail because: --- You reported the bug, or are watching the reporter. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29266
[Bug c++/29266] Rule that binding rvalue to a refernce need a copy ctor don't work
--- Comment #3 from yuanfei8077 at gmail dot com 2006-09-29 03:02 --- Plesae seee Comment #2 From Kelvin 2006-09-28 23:25 [reply]. In addition 2 questions I raised in the Commet2. I also have one more question about the rule bind an rvalue to a reference, we need to let copy ctor of the class be accessible., I found that this rule only effective when the reference is delcared as const , but if we remove keyword const, then no matching happen again. using std::cout; using std::endl; class MemPool { public: MemPool(){}; protected: MemPool(const MemPool mempool); }; template class Type class MemAllocator{ public: MemAllocator(MemPool pool):m_pool(pool){} MemPool get_pool() const { return m_pool; } templateclass OtherType MemAllocatorType operator=(const MemAllocatorOtherType rhs){ m_pool = rhs.get_pool(); return *this; } MemAllocator operator=(const MemAllocator rhs){ m_pool = rhs.get_pool(); return *this; } MemAllocator(const MemAllocator other) : m_pool(other.m_pool) {} templateclass OtherType MemAllocator(const MemAllocatorOtherType other) : m_pool(other.get_pool()) {} private: MemAllocator(); // MemAllocator(const MemAllocator); MemPool m_pool; }; template class _AllocType class tdat_hash_map { public: typedef _AllocType _Alloc; static void func(const _Alloc) {}; tdat_hash_map(const _Alloc); // there will be error if const is removed _Alloc malloc; private: tdat_hash_map(); }; class CacheManager { public: typedef tdat_hash_mapMemAllocatorint Map; Map caches; MemPool pool; CacheManager():caches(MemAllocatorint(pool)){}; }; -- yuanfei8077 at gmail dot com changed: What|Removed |Added Status|RESOLVED|UNCONFIRMED Resolution|INVALID | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29266
[Bug c++/29252] New: Strange No matching function for call compilation error with G++ 4.1
Hi there, I am porting some code to SUSE 10, with G++ 4.1. And hit an strange no matching function call compilation error. I am confused because the calling function and candidate are nearly 100% same. I wonder if this is a known G++ limitation or issue ? Because the same program got compiled with VC8. Below is the compilation environment info and compilation error. env info = g++ (GCC) 4.1.0 (SUSE Linux 10), note that this issue can also be found at G++ 3.2(UL1.0) No compile option is added Compilation error == ./Cache/CacheManager.h:424: error: no matching function for call to tdat_hash_mapstd::basic_stringwchar_t, std::char_traitswchar_t, std::allocatorwchar_t , Elementunsigned int, SqlObjectDefn, std::basic_stringwchar_t, std::char_traitswchar_t, std::allocatorwchar_t *, MemAllocatorstd::pairstd::basic_stringwchar_t, std::char_traitswchar_t, std::allocatorwchar_t , Elementunsigned int, SqlObjectDefn, std::basic_stringwchar_t, std::char_traitswchar_t, std::allocatorwchar_t * ::tdat_hash_map1(MemAllocatorstd::pairstd::basic_stringwchar_t, std::char_traitswchar_t, std::allocatorwchar_t , Elementunsigned int, SqlObjectDefn, std::basic_stringwchar_t, std::char_traitswchar_t, std::allocatorwchar_t * , int) ./Common/TdatHashMap.h:250: note: candidates are: static void tdat_hash_map_Key, _Tp, _AllocType::tdat_hash_map1(_AllocType, int) [with _Key = std::basic_stringwchar_t, std::char_traitswchar_t, std::allocatorwchar_t , _Tp = Elementunsigned int, SqlObjectDefn, std::basic_stringwchar_t, std::char_traitswchar_t, std::allocatorwchar_t *, _AllocType = MemAllocatorstd::pairstd::basic_stringwchar_t, std::char_traitswchar_t, std::allocatorwchar_t , Elementunsigned int, SqlObjectDefn, std::basic_stringwchar_t, std::char_traitswchar_t, std::allocatorwchar_t * ] Any comments/suggestions are higly appreciated. Thanks, -Kelvin -- Summary: Strange No matching function for call compilation error with G++ 4.1 Product: gcc Version: 4.1.0 Status: UNCONFIRMED Severity: critical Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: yuanfei8077 at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29252
[Bug c++/29252] Strange No matching function for call compilation error with G++ 4.1
--- Comment #2 from yuanfei8077 at gmail dot com 2006-09-28 01:50 --- Hi, For your convinence, the following is the reproduction code. Many Thanks, -Kelvin Compilation error = no matching function for call to tdat_hash_mapMemAllocatorint ::func(MemAllocatorint) main.cpp:6: note: candidates are: static void tdat_hash_map_AllocType::func(_AllocType) [with _AllocType = MemAllocatorint] Repro code === template class Type class MemAllocator{}; template class _AllocType class tdat_hash_map { public: typedef _AllocType _Alloc; static void func(_Alloc) {}; }; int main() { typedef tdat_hash_mapMemAllocatorint Map; Map::func((MemAllocatorint) (MemAllocatorint())); return 0; } -- yuanfei8077 at gmail dot com changed: What|Removed |Added Status|WAITING |UNCONFIRMED http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29252
[Bug c++/29261] New: Hiding constructior is required while no direct invocation to it with G++ 4
Hi there, I found that the compiling the following code will fail with g++ 4.1 while cmopile succeed with VC8. I suspect this is a g++ error. env info = g++ (GCC) 4.1.0 (SLES10) No compile option is added Compilation error = main.cpp: In copy constructor MemAllocatorint::MemAllocator(const MemAllocatorint) main.cpp:5: error: MemPool::MemPool(const MemPool) is protected main.cpp:8: error: within this context main.cpp: In function int main() main.cpp:32: note: synthesized method MemAllocatorint::MemAllocator(const MemAllocatorint) first required here Repro code === class MemPool { public: MemPool(){}; protected: MemPool(const MemPool mempool); }; template class Type class MemAllocator{ public: MemPool m_pool; MemAllocator(){} MemPool get_pool() const { return m_pool; } templateclass OtherType MemAllocatorType operator=(const MemAllocatorOtherType rhs){ m_pool = rhs.get_pool; return *this; } }; template class _AllocType class tdat_hash_map { public: typedef _AllocType _Alloc; static void func(_Alloc) {}; }; int main() { typedef tdat_hash_mapMemAllocatorint Map; MemAllocatorint abc = MemAllocatorint(); return 0; } Thanks, -Kelvin -- Summary: Hiding constructior is required while no direct invocation to it with G++ 4 Product: gcc Version: 4.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: yuanfei8077 at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29261