Я новичок в C ++ и читаю раздел 3.4.1 Parameterized Types
из Язык программирования C ++, 4-е изд., Бьярн Страуструп.
То, что пытается показать эта глава, определяет begin()
а также end()
функция в пользовательском типе Vector
так что range-for loop
(Т.е. for (auto&
s: vs
)
) поддерживается .
После определения begin()
а также end()
функции. Я получаю ошибку too few arguments to function call, single argument 'a' was not specified
когда я использую их.
Текст действительно имел это:
В user.cpp:
void f2(const Vector<string> & vs)
{
for (auto& s: vs) //member function 'begin' not viable: 'this' argument has type 'const Vecto<Std::__1::basic_string<char> >
cout << s << '\n';
}
Xcode тогда говорит мне, что member function 'begin' not viable: 'this' argument has type 'const Vecto<Std::__1::basic_string<char> >', but function is not marked const.
Поэтому я пошел дальше и обозначил функции const.
В Vector.h:
template<typename T>
class Vector{
public:
const T* begin(Vector<T>& a);
const T* end(Vector<T>& b);
};
В Vector.cpp:
#include "Vector.h" //get the interface
//To support the range-for loop for our Vector, we must define suitable begin() and end() functions:
template <typename T>
const T* Vector<T>::begin(Vector<T>& x)
{
return & x[0];
}
template <typename T>
const T* Vector<T>::end(Vector<T>& x)
{
return x.begin()+x.size(); //pointer to one past last element.
}
Ошибка сохраняется.
Следующее, что я сделал, это удалил const
из функции f2()
, Я получаю эту новую ошибку too few arguments to function call, single argument 'a' was not specified
, Удаление const из функций в Vector.h
а также Vector.cpp
не имеет никакого значения.
В user.cpp:
#include "Vector.h"void f2(Vector<string> & vs)
{
for (auto& s: vs) //too few arguments to function call, single argument 'a' was not specified
cout << s << '\n';
}
В Vector.h:
template<typename T>
class Vector{
public:
const T* begin(Vector<T>& a);
const T* end(Vector<T>& b);
};
В Vector.cpp:
#include "Vector.h" //get the interface
//To support the range-for loop for our Vector, we must define suitable begin() and end() functions:
template <typename T>
const T* Vector<T>::begin(Vector<T>& x)
{
return & x[0];
}
template <typename T>
const T* Vector<T>::end(Vector<T>& x)
{
return x.begin()+x.size(); //pointer to one past last element.
}
Я включил части кода, которые я считаю наиболее важными, в противном случае доступны полные коды Вот.
Поэтому я пошел дальше и обозначил функции const.
Вы не отметили свои функции-члены const
, Кроме того, они должны быть без параметров. Для этого вам нужно
const T* begin() const;
^^^^^
Обратите внимание, что вам нужно сделать реализацию доступной в заголовочном файле, а не в отдельном .cpp
файл (если вы не включите его в конец заголовка и не будете пытаться его скомпилировать). Также имеет смысл предоставлять неконстантные перегрузки.
template<typename T>
class Vector{
public:
const T* begin() const {return &x[0]; }
const T* end() const { return &c[0] + size(); }
T* begin() {return &x[0]; }
T* end() { return &c[0] + size(); }
size_t size() const { /* return the size */ }
};
У вас две разные проблемы. Первый с константой, потому что ваш begin
а также end
функции не помечены как const
что делает их не вызываемыми на постоянном объекте. Изменить объявление и определение на
const T* begin(Vector<T>& a) const;
const T* end(Vector<T>& b) const;
Обратите внимание const
Ключевое слово после функции. Также обратите внимание, что у вас могут быть как постоянные, так и непостоянные функции с одинаковым именем.
Другая проблема, которая возникает в обеих версиях, заключается в том, что функции ожидают аргумента. Они не Вместо этого они работают на this
, Итак, измени на это:
template <typename T>
const T* Vector<T>::begin() const
{
return &yourInternalVectorVariable[0];
}
Сделайте то же самое для end
функция.