#はじめに
VisualStudio2019 C++で躓いたのメモしときます。
コメントを頂いた@yumetodo様、@amate様、ありがとうございます。
#問題
C++で以下のコード
#include <string>
using namespace std;
int main(void)
{
string s = "text.txt";
s.insert(s.end() - 4, "_output");
}
を実行すると、エラーC2664が出てきますね。なんかダメみたいです。
#解決方法
いろいろ試したところ、stringクラスのinsert関数の第一引数はイテレータじゃなくて「文字列の初めからn文字目に挿入」するnの数を入れるみたいです。なのでlength()を使って、
とりあえず、以下のようにするとコンパイルが通ります。
#include <string>
using namespace std;
int main(void)
{
string s = "text.txt";
s.insert(s.length() - 4, "_output");
}
とすると通りましたね。
##原因
どうやら、stringクラスのリファレンス(https://cpprefjp.github.io/reference/string/basic_string/insert.html)を確認した所、insertメンバ関数のうち、今回のように第一引数にイテレータを代入した場合、以下の4つのどれかの書き方にならなければならないみたいです。
iterator insert(const_iterator p, charT c); // (6) C++11
iterator insert(const_iterator p, size_type n, charT c); // (7) C++11
template<class InputIterator>
iterator insert(const_iterator p,
InputIterator first, InputIterator last); // (8) C++11
iterator insert(const_iterator p, initializer_list<charT>); // (9) C++11
今回の問題は、
insert(イテレータ, 文字列);
の形式で書いてしまい、そんな形式の関数はstringクラスのinsertメンバ関数に存在しません。
また、解決方法でコンパイラが通るのは、リファレンスに
basic_string& insert(size_type pos, const charT* s); // (4)
という関数が用意されていて、たまたま
s.insert(s.length() - 4, "_output");
の書き方が当てはまったからコンパイルが通ったわけですね。