Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C++

C++で「error: cannot initialize a variable of type ‘const unsigned char’ with an lvalue of type ‘const char [x]’」が発生した時の原因と対処

投稿日:2022年1月20日 更新日:

<目次>

(1) C++で「error: cannot initialize a variable of type ‘const unsigned char’ with an lvalue of type ‘const char [x]’」が発生した時の原因と対処
 (1-1) エラーメッセージ&発生状況
 (1-2) 原因
 (1-3) 対策

(1) C++で「error: cannot initialize a variable of type ‘const unsigned char’ with an lvalue of type ‘const char [x]’」が発生した時の原因と対処

(1-1) エラーメッセージ&発生状況

(エラーメッセージ)

error: cannot initialize a variable of type 'const unsigned char' with an lvalue of type 'const char [2]'
 
あくまで発生する一例ですが、「unsigned char uc = “a”;」のように「unsigned char」型の変数に文字列を割り当てたプログラムをコンパイルした際に発生します。

#include <iostream>
using namespace std;

string test(unsigned char uc){
    string str(1, static_cast<char>(uc));
    return str;
}
int main(void){
    unsigned char uc = "a";
    cout << test(uc) << endl;
}
(図111)

目次にもどる

(1-2) 原因

「const unsigned char」型の変数を、「”a”」(const char [4])で初期化できないため、エラーになっています。

C++では文字列リテラル(値を直接プログラムに書いたもの)は、「const char」型の「配列」になります。この配列の大きさは「文字の数+1」になります。「+1」する理由は、文字列の最後にヌル文字(文字列の終端を意味する値)が入るためです。
 
(例)
・文字列リテラル「”123″」は「const char[4]」の型
・文字列リテラル「”a”」なら「const char[2]」の型
 
一方で、代入しようとしている変数は「unsigned char」型のため、型がマッチせずにエラーとなっています。

(1-3) 対策

あくまで、代入される変数が「unsigned char」の例にはなりますが、「unsigned char」は「単一の文字」か「数値」を受け付けるため、それらの値を代入するようにします。
(OK例1)
#include <iostream>
using namespace std;

string test(unsigned char uc){
    string str(1, static_cast<char>(uc));
    return str;
}
int main(void){
    //# 修正箇所
    unsigned char uc = 65;
    cout << test(uc) << endl;
}
 
(図131)

(OK例2)

#include <iostream>
using namespace std;

string test(unsigned char uc){
    string str(1, static_cast<char>(uc));
    return str;
}
int main(void){
    //# 修正箇所
    unsigned char uc = ‘a’;
    cout << test(uc) << endl;
}

(図132)

●(参考)”a”と‘a’の違い

C++ではシングルクォート「’a’」は単一の文字(単一も文字リテラル)を表しています。一方で、ダブルクォート「”a”」はstringリテラルを表しており、「’a’」とヌル文字(\0)の2文字の配列を表しています。なので、似て非なるものなのです。

「’a’」=a
「”a”」=a\0
 

●(参考)unsigned char⇒stringへの変換

「unsigned char型」⇒「string型」への変換は次のように変換します。
(構文)
string (size_t n, char c);
(例)「unsigned char」を「string_cast<char>」でcharにキャストし、stringのコンストラクタを使って、string型に変換しています。
string str(1, static_cast(uc));

Adsense審査用広告コード


Adsense審査用広告コード


-C++

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

ポインタと参照の違いについてサンプルPGを使ってご紹介

  <目次> (1) ポインタと参照の違いについてサンプルPGを使ってご紹介  (1-1) ポインタと参照の概要  (1-2) 両者の違い①:宣言/初期化  (1-3) 両者の違い②:再代入 …

C++の「int **g = new int*;」の意味について

  <目次> (1) C++の「int **g = new int*;」の意味について  (1-1) 「int **g = new int*;」の意味  (1-2) サンプルで理解を深める …

C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点

  <目次> (1) C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点  (1-1) localtime関数がスレッドアンセーフである理由  (1-2) loca …

パイプ通信とは?概要やサンプルプログラムをご紹介

  <目次> (1) パイプ通信とは?概要やサンプルプログラムをご紹介  (1-1) パイプ通信の概要  (1-2) パイプ通信の構文  (1-3) パイプ通信のサンプルプログラム①(単一プ …

C++で発生した「 _CrtIsValidHeapPointer(block)」と「is_block_type_valid(header->_block_use)」エラーについて

  <目次> (1) C++で発生した「 _CrtIsValidHeapPointer(block)」と「is_block_type_valid(header->_block_use) …

  • English (United States)
  • 日本語
Top