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

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

関連記事

C++における「>>」の意味について

  <目次> (1) C++における「>>」の意味について  (1-1) 概要  (1-2) サンプルプログラム  (1-3) どんな時に使われる?⇒データ圧縮  (1-4) 備 …

C++の動的メモリ割当と静的メモリ割当の違いについて

  <目次> (1) C++の動的メモリ割当と静的メモリ割当の違いについて  (1-1) 静的メモリ割当てとは?  (1-2) 動的メモリとは?  (1-3) 動的メモリの割当て  (1-4 …

CORBA通信のPOA(Portable Object Adapter)とは?

  <目次> (1) CORBA通信のPOA(Portable Object Adapter)とは?  (1-1) 概要と特徴  (1-2) 一般的なPOAの処理構成  (1-3) POAの …

GDBの使い方をC++のプログラムのデバッグを例にご紹介

  <目次> (1) GDBの使い方をC++のプログラムのデバッグを例にご紹介  (1-1) GDBのデバッグのシナリオ概要(例)  (1-2) GDBのデバッグ手順(例)  (1-3) そ …

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

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

  • English (United States)
  • 日本語
Top