質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1807閲覧

c++ std::stringのメソッドへの渡し方について

matsuda2

総合スコア29

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/04/13 01:07

前提・実現したいこと

c++でプログラムを書いてます。std::stringをもらうコンストラクタに文字列を渡す箇所でコンパイルエラーが発生してしまいます。
charな文字列をどうしたらstd::stringで渡せるでしょうか?

発生している問題・エラーメッセージ

In file included from BusinessAggregate.cpp:6:
Gloval.h:24:26: error: 'constexpr' needed for in-class initialization of static data member 'LogOperation* "
Gloval::LogOperationInstance' of non-integral type [-fpermissive] static LogOperation *LogOperationInstance = new LogOperation("Operation");
Gloval.h:24:77: error: temporary of non-literal type 'std::__cxx11::string' {aka 'std::__cxx11::basic_string<char>'} in a constant expression
static LogOperation *LogOperationInstance = new LogOperation("Operation");
^
In file included from C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-
mingw32/8.1.0/include/c++/string:52,
from LogOperation.h:8,
from Gloval.h:1,
from BusinessAggregate.cpp:6:
C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-
mingw32/8.1.0/include/c++/bits/basic_string.h:77:11: note: 'std::__cxx11::basic_string<char>' is not literal because:
class basic_string

該当のソースコード

c++

/////////////////////////////////////////////////// Gloval.h ////////////////////////////////////////////////
#include <string>
#include "LogOperation.h"
#include "LogError.h"

class Gloval
{
private:

public:
//コンストラクタ
Gloval();
//デストラクタ
~Gloval();

//運用ログ static LogOperation *LogOperationInstance = new LogOperation("Operation");

};
#endif

/////////////////////////////////////////////////// Log.h ////////////////////////////////////////////////
#ifndef LOGOPERATION
#define LOGOPERATION

#include <string>
#include "Base\Log.h"

class LogOperation : public Log
{
private:

public:
//コンストラクタ
LogOperation(std::string fileName) : Log(fileName){}

//集計結果データ出力 void writeAggegated(std::string message); //内訳データ出力 void writeBreakdown(std::string message);

};
#endif

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

In file included from BusinessAggregate.cpp:6: Gloval.h:24:26: error: 'constexpr' needed for in-class initialization of static data member 'LogOperation* " Gloval::LogOperationInstance' of non-integral type [-fpermissive] static LogOperation *LogOperationInstance = new LogOperation("Operation");

このエラーを読みましょう。Gloval::LogOperationInstance をその場で初期化するためには constexpr で初期化する必要がある、ということです。

LogOperationコンストラクタがconstexprにできるかどうかは不明ですが、もしできないのなら、Gloval宣言内で初期化するのはやめましょう。

Gloval.h:

cpp

1 //運用ログ 2 static LogOperation* LogOperationInstance; 3};

Gloval.cpp:

cpp

1LogOperation* Gloval::LogOperatinIsntance = new LogOperation("Operation");

投稿2021/04/13 02:17

int32_t

総合スコア20884

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

writeAggegated(std::string message);

と宣言されているので・・・。

writeAggegated( std::string(cstr));

では駄目ですか?

投稿2021/04/13 01:13

nfox

総合スコア229

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matsuda2

2021/04/13 01:20

試してみたんですが、下記のエラーを出力します。 In file included from BusinessAggregate.cpp:6: Gloval.h:24:26: error: 'constexpr' needed for in-class initialization of static data member 'LogOperation* Gloval::LogOperationInstance' of non-integral type [-fpermissive] static LogOperation *LogOperationInstance = new LogOperation(std::string("Operation")); ^~~~~~~~~~~~~~~~~~~~ Gloval.h:24:71: error: temporary of non-literal type 'std::__cxx11::string' {aka 'std::__cxx11::basic_string<char>'} in a constant expression static LogOperation *LogOperationInstance = new LogOperation(std::string("Operation")); ^~~~~~~~~~~~~~~~~~~ In file included from C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/string:52, from LogOperation.h:8, from Gloval.h:1, from BusinessAggregate.cpp:6: C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/basic_string.h:77:11: note: 'std::__cxx11::basic_string<char>' is not literal because: class basic_string ^~~~~~~~~~~~
nfox

2021/04/13 01:41

呼び出しているコード部分は? それから、最低コードでのコンパイルは通っているのでしょうか? 今更の指摘かもしれませんが、該当「charな文字列をどうしたらstd::stringで渡せる」の部分だとエラーを判定するために、最低コードで試したと思いますが、元々はどう書かれていて、どう修正したのでしょうか?
matsuda2

2021/04/13 01:54

このように書きけえました。std::stringを文字列の前に追加しました。 static LogOperation *LogOperationInstance = new LogOperation(std::string("Operation"));
maisumakun

2021/04/13 02:36 編集

(質問者への追記に書いたつもりが、間違えてコメントに書いていたので取り消し)
nfox

2021/04/13 02:12

私が言っている最低コードとか、コードの提示は・・・。 class Log { public: Log(std::string filename); }; class LogOperation : public Log { private: public: //コンストラクタ LogOperation(std::string fileName) : Log(fileName) {} //集計結果データ出力 void writeAggegated(std::string message); //内訳データ出力 void writeBreakdown(std::string message); }; void LogOperation::writeAggegated(std::string message) { } void LogOperation::writeBreakdown(std::string message) { } Log::Log(std::string filename) { } int main() { static LogOperation* LogOperationInstance = new LogOperation("Operation"); // char a[] = { 'a','b','c','\0' }; LogOperationInstance->writeAggegated(std::string(a)); } こんな感じで試してみましたか? 上記なら、コンパイルは通ると思いますが? 駄目なら、gcc 側の設定や環境の問題を疑ってしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問