использование цикла range-for: слишком мало аргументов для вызова функции, один аргумент ‘a’ не указан

Я новичок в 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.
}

Я включил части кода, которые я считаю наиболее важными, в противном случае доступны полные коды Вот.

0

Решение

Поэтому я пошел дальше и обозначил функции 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 */ }
};
4

Другие решения

У вас две разные проблемы. Первый с константой, потому что ваш 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 функция.

3

По вопросам рекламы [email protected]