回答編集履歴
8
文言修正
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
|
-
コメント頂きましたが、以下
|
55
|
+
コメント頂きましたが、以下のようにしてもコンパイルが通りますね。
|
56
56
|
|
57
57
|
```C++
|
58
58
|
|
7
コメントいただいたコード追記
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
文言修正
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
文言修正
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++でのエラー追記
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
文言修正
test
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
|
27
27
|
---
|
28
28
|
|
29
|
-
すみません、上記はg++でコンパイルが通らない理由でした。
|
29
|
+
すみません、上記はg++でのコンパイルが通らない理由でした。
|
30
30
|
|
31
31
|
以下のようにするとclangでもコンパイルが通りました。
|
32
32
|
|
2
コード追記
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
リンク追加
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以上)
|