btree requires key to be Default Constructibe
GoogleCodeExporter opened this issue · 1 comments
GoogleCodeExporter commented
See summary. This is not required for ordinary std::set.
To reproduce:
$ cat bug.cpp
#include "btree_set.h"
#include <set>
class Foo {
int bar_;
public:
explicit Foo(int bar): bar_(bar) {}
};
int main(void) {
btree::btree_set<Foo> a;
std::set<Foo> b;
return 0;
}
$ clang++ bug.cpp -std=c++11 -stdlib=libc++
In file included from bug.cpp:1:
In file included from ./btree_set.h:27:
./btree.h:1402:55: error: no matching constructor for initialization of
'key_type' (aka 'Foo')
sizeof(key_compare_checker(key_compare_helper()(key_type(), key_type()))) ==
^
./btree.h:161:31: note: expanded from macro 'COMPILE_ASSERT'
typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]
^
./btree_container.h:32:20: note: in instantiation of template class
'btree::btree<btree::btree_set_params<Foo, std::__1::less<Foo>,
std::__1::allocator<Foo>, 256>>' requested here
typedef typename Tree::params_type params_type;
^
./btree_container.h:147:39: note: in instantiation of template class
'btree::btree_container<btree::btree<btree::btree_set_params<Foo,
std::__1::less<Foo>, std::__1::allocator<Foo>, 256>>>' requested here
class btree_unique_container : public btree_container<Tree> {
^
./btree_set.h:37:26: note: in instantiation of template class
'btree::btree_unique_container<btree::btree<btree::btree_set_params<Foo,
std::__1::less<Foo>, std::__1::allocator<Foo>, 256>>>' requested here
class btree_set : public btree_unique_container<
^
bug.cpp:11:25: note: in instantiation of template class 'btree::btree_set<Foo,
std::__1::less<Foo>, std::__1::allocator<Foo>, 256>' requested here
btree::btree_set<Foo> a;
^
bug.cpp:7:12: note: candidate constructor not viable: requires 1 argument, but
0 were provided
explicit Foo(int bar): bar_(bar) {}
^
bug.cpp:4:7: note: candidate constructor (the implicit copy constructor) not
viable: requires 1 argument, but 0 were provided
class Foo {
^
bug.cpp:4:7: note: candidate constructor (the implicit move constructor) not
viable: requires 1 argument, but 0 were provided
1 error generated.
$ clang -v
Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.2
Thread model: posix
Original issue reported on code.google.com by an...@korobeynikov.info
on 14 Feb 2013 at 5:46
GoogleCodeExporter commented
I suspect we could remove the CompileAssert and it would build. I'll talk to
Peter about fixing this.
Original comment by josh.mac...@gmail.com
on 21 Feb 2013 at 6:37