これは、1つのオブジェクトの私(剥奪)クラスとインスタンス化である:このコンストラクタのオーバーロードが間違って解決されるのはなぜですか?
template <typename T, typename Allocator = std::allocator<T> >
class Carray {
typedef typename Allocator::size_type size_type;
// ...
explicit Carray(size_type n, const T& value, const Allocator& alloc = Allocator()) {
// ...
}
template<typename InputIterator>
Carray(InputIterator first, InputIterator last, const Allocator& alloc = Allocator()) {
// ...
}
// ...
}
Carray<int> array(5, 10);
私は、これはCarray(size_type, const T&, const Allocator&)
コンストラクタを呼び出すことを期待するが、それはしていません。 Apparantlyこれはtemplate<typename InputIterator> Carray(InputIterator, InputIterator, const Allocator&)
に解決します。
この作品を意図したものにするために変更する必要はありますか? std::vector<int> v(5, 10)
への電話が完全に正常に機能するので、私はそれも変だと思う。私はGCCの実装では、コンストラクタの定義を見れば、私は(私が__n
のように、いくつかのコンパイラの実装名を改称)これを見つける:
template<typename T, typename A = std::allocator<T> >
class vector {
typedef size_t size_type;
typedef T value_type;
typedef A allocator_type;
// ...
explicit vector(size_type n, const value_type& value = value_type(), const allocator_type& a = allocator_type());
template<typename InputIterator>
vector(InputIterator first, InputIterator last, const allocator_type& a = allocator_type());
// ...
};
同じであると思われます。
ありがとうございます。これにより、私はboostまたはnon-C++ 03に依存せずにヘッダを完全に定義することができます。私はもちろんこれを生産コードでは使用しません(boost :: enable_ifは使いやすく適切です)。 – orlp
@ nightcracker、心配するな...それは面白い挑戦だった... – Nim