回答編集履歴
8
文言修正
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
|
-
コメント頂きましたが、以下
|
28
|
+
コメント頂きましたが、以下のようにしてもコンパイルが通りますね。
|
29
29
|
```C++
|
30
30
|
template<typename T>
|
31
31
|
class A {
|
7
コメントいただいたコード追記
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
文言修正
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
文言修正
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++でのエラー追記
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
文言修正
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
コード追記
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
リンク追加
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以上)
|