クラステンプレート内で型名を指定しなくていい理由

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 4
  • VIEW 1,004

saki_chan

score 15

クラステンプレート内で、型名を指定しなくても使えてしまうのですが、これはどういった仕様でしょうか。
できれば、どうしてこのような仕様なのかも教えてくださると助かります。

template <typename T>
struct X
{
    //戻り値に<T>をつけなくて大丈夫なのはなぜ?
    X f()
    {
        return *this;
    }
};

int main()
{
    [[maybe_unused]] X<int> x;
    [[maybe_unused]] X<int> x2 = x.f();

    return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+5

いまいち確信が持てませんがここかな・・・

C++11(N3337)より

[class] 2
class-name is inserted into the scope in which it is declared immediately after the class-name is seen. The class-name is also inserted into the scope of the class itself; this is known as the injected-class-name. For purposes of access checking, the injected-class-name is treated as if it were a public member name. A class-specifier is commonly referred to as a class definition. A class is considered defined after the closing brace of its class-specifier has been seen even though its member functions are in general not yet defined. The optional attribute-specifier-seq appertains to the class; the attributes in the attribute-specifier-seq are thereafter considered attributes of the class whenever it is named.

[temp.local] 1
Like normal (non-template) classes, class templates have an injected-class-name (Clause [class]). The injected-class-name can be used as a template-name or a type-name. When it is used with a template-argument-list, as a template-argument for a template template-parameter, or as the final identifier in the elaborated-type-specifier of a friend class template declaration, it refers to the class template itself. Otherwise, it is equivalent to the template-name followed by the template-parameters of the class template enclosed in <>.

つまりinjected-class-nameになるから使える理論。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/01 13:50

    いえいえ、こちらこそ勉強になりました!ありがとうございます!

    キャンセル

  • 2019/08/02 00:11

    補足:
    > どうしてこのような仕様なのかも教えてくださると助かります。
    単純に「その方が便利だから」でしょうね。この仕様がなければ、クラステンプレート定義が恐ろしく煩雑になってしまいますから。

    この仕様はC++初期から存在するようです。(C++98→03で若干文面は変わったらしい)
    https://stackoverflow.com/questions/25549652/

    キャンセル

  • 2019/08/02 17:49 編集

    私は時間稼ぎにしかなりませんでしたが(?)ありがとうございました!

    キャンセル

0

//戻り値に<T>をつけなくて大丈夫なのはなぜ?

構文的には間違っていないからではないでしょうか?
戻り値の型がstruct Xの関数fなだけですよね。

「T」をテンプレートの型として定義はしていますが、
絶対に使わないといけないという縛りは無いのかなと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/31 11:01

    質問の意図はtemplate classにおいて、自身のクラス型について型パラメータを省略できるのはどこで許可されているのか?ということだと思います・・・。

    ほかにも

    template<typename T>
    struct X{
    // copy ctor
    X(const X&);//引数はconst X<T>&じゃなくてよい
    // ctor
    template<typename T2>
    X(const X<T2>&);//const X<T>&以外(別のT)を受け取る
    };

    など。

    キャンセル

  • 2019/07/31 11:17

    んーでは、T型を使う前提のX型であればわざわざX<T>と書かなくて良い、というのが回答になりますかね。
    C++の規格書のどこそこに、こう書かれているから、という1次ソースはもう少しC++のお強い方におまかせします。

    キャンセル

  • 2019/07/31 15:59

    そうですね、どこで<T>を省略できるかが書かれているのかを知りたいです。
    できれば、明確な理由等も教えてくださると助かります。

    キャンセル

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる