回答編集履歴

8

文言修正

2020/11/21 22:11

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -34,7 +34,7 @@
34
34
 
35
35
  clangのバグのような気がしますが、
36
36
 
37
- 以下のようにするとclangもコンパイルが通りました。
37
+ 以下のようにするとclang、g++とコンパイルが通りました。
38
38
 
39
39
  ```C++
40
40
 
@@ -52,7 +52,7 @@
52
52
 
53
53
  ---
54
54
 
55
- コメント頂きましたが、以下clangでもコンパイルが通りますね。
55
+ コメント頂きましたが、以下のようにしてもコンパイルが通りますね。
56
56
 
57
57
  ```C++
58
58
 

7

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

2020/11/21 22:11

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -49,3 +49,23 @@
49
49
  };
50
50
 
51
51
  ```
52
+
53
+ ---
54
+
55
+ コメント頂きましたが、以下でもclangでもコンパイルが通りますね。
56
+
57
+ ```C++
58
+
59
+ template<typename T>
60
+
61
+ class A {
62
+
63
+ using ClassB = B<T>;
64
+
65
+ friend void ClassB::funcB(typename ClassB::type);
66
+
67
+ static void funcA() {}
68
+
69
+ };
70
+
71
+ ```

6

文言修正

2020/11/21 22:08

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  すみません、上記はg++でのコンパイルが通らない理由でした。
30
30
 
31
- g++では`error: 'B::type' is not a type`とエラーになります。
31
+ g++では`typename`が無いと`error: 'B::type' is not a type`とエラーになります。
32
32
 
33
33
 
34
34
 

5

文言修正

2020/11/21 21:44

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -32,6 +32,8 @@
32
32
 
33
33
 
34
34
 
35
+ clangのバグのような気がしますが、
36
+
35
37
  以下のようにするとclangでもコンパイルが通りました。
36
38
 
37
39
  ```C++

4

g++でのエラー追記

2020/11/21 21:40

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -28,6 +28,10 @@
28
28
 
29
29
  すみません、上記はg++でのコンパイルが通らない理由でした。
30
30
 
31
+ g++では`error: 'B::type' is not a type`とエラーになります。
32
+
33
+
34
+
31
35
  以下のようにするとclangでもコンパイルが通りました。
32
36
 
33
37
  ```C++

3

文言修正

2020/11/21 21:35

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  ---
28
28
 
29
- すみません、上記はg++でコンパイルが通らない理由でした。
29
+ すみません、上記はg++でコンパイルが通らない理由でした。
30
30
 
31
31
  以下のようにするとclangでもコンパイルが通りました。
32
32
 

2

コード追記

2020/11/21 21:34

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -21,3 +21,25 @@
21
21
  - テンプレートの宣言または定義の中で、 (C++11未満)非依存修飾型名の前で typename を使用することができます。 この場合、効果はありません。
22
22
 
23
23
  - 要件の中で型要件に対して (C++20以上)
24
+
25
+
26
+
27
+ ---
28
+
29
+ すみません、上記はg++でコンパイルが通らない理由でした。
30
+
31
+ 以下のようにするとclangでもコンパイルが通りました。
32
+
33
+ ```C++
34
+
35
+ template<typename T, class ClassB = B<T>>
36
+
37
+ class A {
38
+
39
+ friend void ClassB::funcB(typename ClassB::type);
40
+
41
+ static void funcA() {}
42
+
43
+ };
44
+
45
+ ```

1

リンク追加

2020/11/21 21:31

投稿

SHOMI
SHOMI

スコア4079

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