g++
дает немного другой вывод для той же ошибки:
cannot bind non-const lvalue reference of type 'std::__cxx11::basic_string<char>&' to an rvalue of type 'std::__cxx11::basic_string<char>'
clang++
:
non-const lvalue reference to type 'std::__cxx11::basic_string<char>' cannot bind to a value of unrelated type 'const char [3]'
Решение состоит в том, чтобы принять аргумент как const&
.
Далее вы обнаружите, что T arr[CAPACITY] = { 0 };
дает исключение времени выполнения, подобное : basic_string::_M_construct null not valid
.
Вы не ноль, инициализирующий arr
таким образом. Фактически, вы создаете новый arr
и пытаетесь создать его с помощью nullptr
, который не будет работать для std::string[]
.
Вы можете также использовать целое число без знака как size_t
для подсчета элементы как стандартные контейнеры, чтобы облегчить будущие взаимодействия со стандартными функциями / алгоритмами.
С этим исправлено: *
#include <iostream>
#include <string>
template<typename T, size_t Capacity = 10> // made the capacity selectable
class container {
public:
container() : arr{}, n(0) {} // using member initializer list
bool isFull() const { return n == Capacity; } // correct test with a 0 based counter
bool insertBack(const T& val) { // const
if (isFull()) return false;
// return true or false, not 1 or 0
arr[n++] = val;
return true;
}
private:
T arr[Capacity];
size_t n;
};
int main() {
container<std::string> s1;
s1.insertBack("aa");
}