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

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

関連記事

no image

Base64のプログラムのサンプル(C++言語)と解説

  <目次> (1) Base64のプログラムのサンプル(C++言語)と解説  (1-1) Base64とは?  (1-2) Base64のプログラム例(C++) (1) Base64のプロ …

C++で「静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります」エラーが出た時の対処

  <目次> (1) C++で「静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります」エラーが出た時の対処  (1-1) エラーメッセージ  (1-2) 原因 …

C++のunsigned char型とは?概要やsigned charとの違いもご紹介

<目次> (1) C++のunsigned char型とは?概要やsigned charとの違いもご紹介  (1-1) 概要  (1-2) サンプルプログラム①:疎通確認 (1) C++のunsign …

C++のマルチスレッド処理のサンプルや概要について

  <目次> (1) C++のマルチスレッド処理のサンプルや概要について  (1-1) C++のマルチスレッドの概要  (1-2) 構文1:関数ポインタ式  (1-3) 構文1(例):関数ポ …

C++の構造体とは?の作り方や使い方について

  <目次> (1) C++の構造体とは?の作り方や使い方について  (1-1) 構造体とは?  (1-2) サンプルプログラム  (1-3) 構造体の変数を定義する方法  (1-4) 構造 …

  • English (United States)
  • 日本語
Top