teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

8

文言修正

2020/11/21 22:11

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -16,7 +16,7 @@
16
16
  g++では`typename`が無いと`error: 'B::type' is not a type`とエラーになります。
17
17
 
18
18
  clangのバグのような気がしますが、
19
- 以下のようにするとclangもコンパイルが通りました。
19
+ 以下のようにするとclang、g++とコンパイルが通りました。
20
20
  ```C++
21
21
  template<typename T, class ClassB = B<T>>
22
22
  class A {
@@ -25,7 +25,7 @@
25
25
  };
26
26
  ```
27
27
  ---
28
- コメント頂きましたが、以下clangでもコンパイルが通りますね。
28
+ コメント頂きましたが、以下のようにしてもコンパイルが通りますね。
29
29
  ```C++
30
30
  template<typename T>
31
31
  class A {

7

コメントいただいたコード追記

2020/11/21 22:11

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -23,4 +23,14 @@
23
23
  friend void ClassB::funcB(typename ClassB::type);
24
24
  static void funcA() {}
25
25
  };
26
+ ```
27
+ ---
28
+ コメント頂きましたが、以下でもclangでもコンパイルが通りますね。
29
+ ```C++
30
+ template<typename T>
31
+ class A {
32
+ using ClassB = B<T>;
33
+ friend void ClassB::funcB(typename ClassB::type);
34
+ static void funcA() {}
35
+ };
26
36
  ```

6

文言修正

2020/11/21 22:08

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  ---
15
15
  すみません、上記はg++でのコンパイルが通らない理由でした。
16
- g++では`error: 'B::type' is not a type`とエラーになります。
16
+ g++では`typename`が無いと`error: 'B::type' is not a type`とエラーになります。
17
17
 
18
18
  clangのバグのような気がしますが、
19
19
  以下のようにするとclangでもコンパイルが通りました。

5

文言修正

2020/11/21 21:44

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -15,6 +15,7 @@
15
15
  すみません、上記はg++でのコンパイルが通らない理由でした。
16
16
  g++では`error: 'B::type' is not a type`とエラーになります。
17
17
 
18
+ clangのバグのような気がしますが、
18
19
  以下のようにするとclangでもコンパイルが通りました。
19
20
  ```C++
20
21
  template<typename T, class ClassB = B<T>>

4

g++でのエラー追記

2020/11/21 21:40

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -13,6 +13,8 @@
13
13
 
14
14
  ---
15
15
  すみません、上記はg++でのコンパイルが通らない理由でした。
16
+ g++では`error: 'B::type' is not a type`とエラーになります。
17
+
16
18
  以下のようにするとclangでもコンパイルが通りました。
17
19
  ```C++
18
20
  template<typename T, class ClassB = B<T>>

3

文言修正

2020/11/21 21:35

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -12,7 +12,7 @@
12
12
  - 要件の中で型要件に対して (C++20以上)
13
13
 
14
14
  ---
15
- すみません、上記はg++でコンパイルが通らない理由でした。
15
+ すみません、上記はg++でコンパイルが通らない理由でした。
16
16
  以下のようにするとclangでもコンパイルが通りました。
17
17
  ```C++
18
18
  template<typename T, class ClassB = B<T>>

2

コード追記

2020/11/21 21:34

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -9,4 +9,15 @@
9
9
  - テンプレート宣言において、 型テンプレート引数およびテンプレートテンプレート引数 (C++17以上)を宣言するために class の代替として使用することができます。
10
10
  - テンプレートの宣言または定義の中で、依存修飾名が型であることを宣言するために使用することができます。
11
11
  - テンプレートの宣言または定義の中で、 (C++11未満)非依存修飾型名の前で typename を使用することができます。 この場合、効果はありません。
12
- - 要件の中で型要件に対して (C++20以上)
12
+ - 要件の中で型要件に対して (C++20以上)
13
+
14
+ ---
15
+ すみません、上記はg++でコンパイルが通らない理由でした。
16
+ 以下のようにするとclangでもコンパイルが通りました。
17
+ ```C++
18
+ template<typename T, class ClassB = B<T>>
19
+ class A {
20
+ friend void ClassB::funcB(typename ClassB::type);
21
+ static void funcA() {}
22
+ };
23
+ ```

1

リンク追加

2020/11/21 21:31

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -2,4 +2,11 @@
2
2
  ```diff
3
3
  -friend void B<T>::funcB(B<T>::type;
4
4
  +friend void B<T>::funcB(typename B<T>::type);
5
- ```
5
+ ```
6
+ ---
7
+ [C++ のキーワード: typename](https://ja.cppreference.com/w/cpp/keyword/typename)
8
+ **用途**
9
+ - テンプレート宣言において、 型テンプレート引数およびテンプレートテンプレート引数 (C++17以上)を宣言するために class の代替として使用することができます。
10
+ - テンプレートの宣言または定義の中で、依存修飾名が型であることを宣言するために使用することができます。
11
+ - テンプレートの宣言または定義の中で、 (C++11未満)非依存修飾型名の前で typename を使用することができます。 この場合、効果はありません。
12
+ - 要件の中で型要件に対して (C++20以上)