c++のコンストラクタが非クラス型であるオッドボール問題
2022-02-14 22:31:04
奇妙な問題で、明らかに本のコードを真似て小さな試みをした結果
error: request for member 'push' in 's', which is of non-class type 'T_stack
()'
|codes
ここで、テンプレートクラスを試してみたいと思います。すると、何かが間違っていた。
template <typename T> class T_stack{
public:
typedef typename std::vector<T>::size_type size_type;
T_stack<T>():data(std::make_shared<std::vector<T>>()){}
//T_stack
(std::initializer_list
);
bool empty(){return data->empty();}
void push( T &t){data->push_back(t);}
void push(const T &&t){data->push_back(t);}
//void pop();
T &top();
private:
std::shared_ptr<std::vector<T>> data;
};
template <typename T>
void T_stack<T>::pop(){
data-> pop_back();
}
template <typename T>
T &T_stack<T>::top(){
return data->back();
}
/*template
T_stack::T_stack
(std::initializer_list
il){
}*/
int main()
{
T_stack<int> s();
s.push(5);
std::cout << s.top();
}
コンパイラはエラーを報告し、エラーコードはちょうど問題があるのはpush関数であると仮定してpush関数で報告されます。実際には、コンストラクタで発生しています。むしろ不思議です。
を使ったからなんです。
T_stack<int> s()
というのがあり、それが原因でした。
のような引数のないコンストラクタは
T_stack<T>()
は、オブジェクト宣言でも関数宣言でもかまいません。しかし、c++コンパイラは、常にオブジェクトよりも関数宣言を優先します。
この曖昧さを回避する方法をいくつか調べてみました。
1. オブジェクトを()で初期化しない。
T_stack<int> s
2. 大括弧 {} を使って、オブジェクトを初期化します。
T_stack<int> s{};
3. 代入演算子と匿名のデフォルトを使用して構築されたオブジェクト。
T_stack<int> s = T_stack<int> {}
.
関連
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み】G++のclass::functionへの未定義の参照 [重複].
-
[解決済み] C++エラー:unqualified-idが予想される場合の対処方法
-
[解決済み] QStringをstd::stringに変換する方法は?
-
[解決済み] x86アセンブリの「ロック」命令の意味を教えてください。
-
[解決済み] .h.gchファイルとは何ですか?
-
[解決済み] 変数またはフィールド(関数)がvoid宣言されている
-
[解決済み] コンパイラの内部エラーメッセージの意味と対処方法について教えてください。
-
[解決済み] std::stringをLPCSTRに変換する方法は?
-
c++ 変数は .h ヘッダーファイルで定義してはいけません (main は *.obj solution で既に定義されています) 。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] "No rule to make target 'install'"... しかし、Makefileは存在する
-
[解決済み] omp_set_num_threads() を使用してスレッド数を 2 に設定すると、omp_get_num_threads() は 1 を返します。
-
[解決済み] unordered_map の unordered_map がキーを含むかどうかを確認する最も簡単な方法
-
[解決済み] ostringstream で Implicit instantiation エラーが発生する
-
[解決済み] 優先キューを用いた中央値の算出
-
[解決済み] glm::mat4 のコンストラクタはどのように動作するのですか?
-
c++ write シンプルなmipsコンパイラ
-
linux c/c++で "terminate called after an instance of 'std::system_error' throw "というエラーを処理するにはどうしたらいいですか?
-
c++ の集約 'std::stringstream ss' は不完全な型であり、定義できない。