C++: エラー C2228: '.str' の左側にはクラス/構造体/結合が必要
2022-02-09 14:06:35
次のコードはエラー C2228 を報告します:left of '.str' must have class/struct/union
#include <string>
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
class ValueBox {
private:
T value;
private:
template<typename U,
typename std::enable_if<std::is_class<U>::value & & !std::is_same<U, string>::value, U>::type* = nullptr,
typename std::enable_if<!class_str<U>::ret, U>::type* = nullptr>
std::string str(const T&) {
cout << "1.---------------------" << endl;
return "null";
};
template<typename U,
typename std::enable_if<std::is_class<U>::value && std::is_same<U, string>::value, U>::type* = nullptr>
std::string str(const T&) {
cout << "2. ---------------------" << endl;
return value;
};
template<typename U,
typename std::enable_if<std::is_class<U>::value && !std::is_same<U, string>::value, U>::type* = nullptr,
typename std::enable_if<class_str<U>::ret, U>::type* = nullptr>
std::string str(const T&) {
cout << "3. ---------------------" << endl;
return value.str();
};
template<typename U,
typename std::enable_if<!std::is_class<U>::value && std::is_arithmetic<U>::value, U>::type* = nullptr>
std::string str(const T&) {
cout << "4.---------------------" << endl;
return std::to_string(value);
};
public:
ValueBox(const T& _value) : value(_value) {
}
const T& getValue() const {
return value;
};
T& getValue() {
return value;
};
std::string str() {
return str<T>(value);
};
};
int main() {
ValueBox <string> s("sddds");
cout << s.str() << endl;
ValueBox <bool> j ( true);
cout << j.str() << endl;
ValueBox<int> i(100);
cout << i.str() << endl;
ValueBox<float> f ( 10.6f);
cout << f.str() << endl;
ValueBox<Box> b1 (Box());
cout << b1.str() << endl;
ValueBox<Bin> b2 (Bin());
cout << b2.str() << endl;
return 1;
}
エラーの原因は、C++コンパイラがValueBox<Box> のb1 (Box()); を関数定義と見なし、Box() を、この時点では関数名が未定義である以外はBoxを返すパラメータなしの関数として見なすからである。このエラーには、一般的な名称があり、こう呼ばれています。Most Vexing Parse(最も厄介な解析
これを修正する方法はいくつかあります。
1. Boxを別行動にし、初期化する
Box b; // Box b();は使えないので、bは再び関数として定義されることになる
ValueBox<Box> b1(b)です。
2. Box()を括弧でくくり、Box()を関数と見なさないようにする。
ValueBox<Box> b1 ((Box()))です。)
3. C++11の統一的な初期化構文で、{}を使用する。
ValueBox<Box> b1 {Box()} です。
参考資料
C++の構文解析で最も頭痛の種となる曖昧さ
項目6.C++の最も厄介な構文解析を警戒せよ
Effective STLノート。項目6--C++の最も厄介な構文解析に注意する
関連
-
Linux の 'pthread_create' への未定義参照問題を解決しました。
-
エラー: 'xxx' は事前宣言と C++ ヘッダーファイルが互いに含まれているため、型名になりません。
-
C++ JSON ライブラリ jsoncpp 新 API の使用法 (CharReaderBuilder / StreamWriterBuilder)
-
エラー: ローカル変数 'res' に関連付けられたスタックメモリのアドレスが返された
-
C++ 文字列における c_str(), data(), copy(p,n) 関数の使用法
-
VCのグローバル変数が*.objで既に定義されている場合の問題点
-
C++ [エラー] 'std::string {aka std::basic_string<char>}' を 'char*' に変換できないエラー
-
stoi' の解決策は、Dev-c++ のこのスコープで宣言されていません。
-
ベクトル添え字が範囲外のコンテナの使用、その他類似のエラー
-
デバッグエラー Assertion Failed 問題について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
error: '.' トークンの前に未修飾の ID が必要です。
-
C++11での移動セマンティクス(std::move)と完全な前進(std::forward)。
-
c++ std::move Principle の実装と使用法のまとめ
-
警告 - 符号付き整数式と符号なし整数式の比較 [-Wsign-compare] 解決方法
-
デバッグアサーションに失敗した」場合の解決策の一つ(着想)
-
致命的なエラー LNK1169: 1つ以上の多重定義されたシンボルが見つかりました 解決策
-
const char*' から 'char*' への変換が無効です。
-
gccコンパイルエラーの一覧
-
C++共通ライブラリ関数一覧
-
ベクター使用時、ベクター添え字が範囲外、その他類似のエラーが発生する。