47946


(参考書:明解c++中級編の426ページ)`char* p[] = { "PAUL", "X", "MAC" };`  
のコメントでここですと示した場所なのですがなぜコンパイルエラーになるのですか？

[重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態  
エラー C2440 '初期化中': 'const char [2]' から 'char *' に変換できません。]  
///////////////////  
[重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態  
エラー (アクティブ) E0144 型 "const char *" の値を使用して型 "char *" のエンティティを初期化することはできません ]

と表示されてまい構文エラーが治せません、そもそも参考書のコードなので間違えてるとはおもえないのと初学者のためデバックに困っています。自分で少し書き換えてみましたがやはりわからないので回答をお願いしたいです。(コピペも試しました。)

[code]

                #include "conio.h"
            #//include <iomanip>
            #include <string>
            #include <iostream>
            #include <vector>
            //#include <algorithm>
            //#include <functional>
            //#include <typeinfo>
            using namespace std;
    
            vector<string> str2dary_to_vec(char* p, int h, int w)
            {
                vector<string> temp;
                for (int i = 0; i < h; i++) {
                    temp.push_back(&p[i * w]);
                }
    
                return temp;
            }
    
            vector<string> strptary_to_vec(char** p, int n)
            {
                vector<string> temp;
                for (int i = 0; i < n; i++)
                {
                    temp.push_back(p[i]);
                }
    
                return temp;
            }
    
    
    
    
            int main()
            {
                //  char* p[]   = {"PAUL", "X", "MAC"}; 
    
                char a[][5] = { "LISP","C","Ada" };
                char* p[] = { "PAUL", "X", "MAC" };//ここです
    
    
                vector<string> sa = str2dary_to_vec(&a[0][0],3,5);
                for (vector<string>::size_type i = 0; i < sa.size(); i++) {
                    cout << "sa[" << i << "] " << sa[i] << "\n";
                }
    
                vector<string> sp = strptary_to_vec(p, 3);
                for (vector<string>::size_type i = 0; i < sp.size(); i++) {
                    cout << "sa[" << i << "] " << sp[i] << "\n";
    
                }
    
    
    
    
                _getch();
                return 0;
            }
    
[/code]


CC BY-SA 4.0
2018-08-30T13:58:05.573
47945
2018-08-30T16:55:56.383
question
c++
c++,文字列配列ベクトルで原因のわからないコンパイルエラー


> 参考書のコードなので間違えてるとはおもえない

「明解c++中級編」はC++標準を完全に無視した悪質な書籍と言えます。初学者は読むべきではありません。

エラーの通りC++言語では'const char [2]' から 'char *' へは変換できません。Visual
C++では拡張機能により変換が許可されていましたが、Visual Studio
2013で導入された[`/Zc:strictStrings`オプション](https://docs.microsoft.com/en-
us/cpp/build/reference/zc-strictstrings-disable-string-literal-type-
conversion?view=vs-2017)によりこの機能を無効化できます。更にVisual Studio
2017で導入された`/permissive-`オプションでC++標準準拠に指定すると`/Zc:strictStrings`も連動して有効になります。

初学者を自称するのであれば、標準に準拠した書籍を読むか、書籍が指定する環境を用意するか、どちらかの対応をとるべきです。


CC BY-SA 4.0
2018-08-30T14:26:57.203
47946
2018-08-30T14:26:57.203
4236
47945
answer


C2440 のエラーが出る理由ですが、

`char *p = "ABC";`

の方が、このエラーが出る、より簡単な文なので、この文を使って説明します。

まず、右辺の`"ABC"`は`const char
[4]`という型を持っています。配列の長さが4になるのは、最後に'\0'が付くからです。また、これは定数なので変更できず、`const`が付きます。配列は、式の中でポインタとして扱われるので、結果的に右辺は`cosnt
char *`ということになります。

さて、これを左辺の`p`に代入するわけですが、`p`の型は`char
*`で`const`がついていません。これがすんなり代入できてしまうと、変更できないはずの`"ABC"`の中身が、`p`を通して変更できてしまいます。これはまずいのでエラーになっています。

もとのコードで、  
`const char* p[] = { "PAUL", "X", "MAC" };`  
とすれば、その場でのエラーは出なくなりますが、今度は`p`を引数に取っている`strptary_to_vec`関数でエラーが出るはずですので、そちらも直す必要があります。


CC BY-SA 4.0
2018-08-30T16:55:56.383
47951
2018-08-30T16:55:56.383
3605
47945
answer