2016-09-12 9 views
-2
template<typename T> 
class A { 
public: 
    A(const T &t) 
    { 
     std::cout << t; 
    } 
}; 
class C : 
    public A<int>, 
    public A<char> 
{ 

public: 
    C(char c) : A<char>(c) {} 

}; 

void main() 
{ 
    C obj('c'); 

} 

以下のプログラムをコンパイルしている間、コンパイラは次のエラーを出しています。 クラス "A <int>"のデフォルトのコンストラクタはありませんテンプレートの継承の仕組みは?

内部的にどのようなコンパイラがありますか?

+3

コンパイラが内部で行うことは誰が気にしますか。基本サブオブジェクトのいずれかに初期化子を指定していない場合は、そのすべてが重要です。 –

+4

なぜ 'A 'の 'C'の部分を作りますが、' A 'の部分は作っていませんか? – NathanOliver

+4

コンパイラが問題の内容を正確に伝えています。 – SergeyA

答えて

4

Cは、2つの基本クラス - A<int>A<char>を持っています。ベースクラスA<char>コンストラクタへの明示的な呼び出しを指定しましたが、基本クラスA<int>に対して何も指定していません。コンストラクタがinitializer-listで明示的に使用されていない場合、コンパイラはデフォルトのコンストラクタを呼び出そうとします。 Aは、デフォルトコンストラクタを定義していないので、問題であること

C(char c) : A<char>(c), A<int>() {} 

:したがって、

C(char c) : A<char>(c) {} 

は同等です。

C(char c) : A<char>(c), A<int>(0) {} 

を使用して問題を解決することができます。

+0

AはPlain Old Data(POD)を持つオブジェクトです。コンパイラがデフォルトのctorを提供しないのはなぜですか? – Gregg

+1

@Gregg、別のユーザー定義のコンストラクターが定義されている場合、デフォルトのコンストラクターがコンパイラーによって削除されます。それが言語の定義方法です。 –