2016-03-26 7 views
0

私は、次のコードがあります追加のテンプレートパラメータを持つ関数をコンパイル

ファイルmain.cppに:

#include <iostream> 
#include "A.h" 
class X{}; 
int 
main() 
{ 
    X x; 
    A<X> a(x); 
} 

ファイルA-inl.h

#include <iostream> 
template <class T1> 
A<T1>::A(T1 t) 
{ 
} 
template <class T1> 
void A<T1>::foo(T1 t1) 
{ 
} 
template <class T1, class T2> 
void A<T1>::bar(T1 t, T2 t2) // Compilation Problem 
{ 
} 

ファイルああ

template <class T1> 
class A 
{ 
public: 
    explicit A(T1 t1); 
    void foo(T1 t1); 
    template <class T2> 
    void bar(T1 t1, T2 t2); // Compilation Problem 
}; 
#include "A-inl.h" 

g ++ -g main.cp p

In file included from A.h:11:0, 
A-inl.h:14:6: error: prototype for ‘void A<T1>::bar(T1, T2)’ does not  match any in class ‘A<T1>’ 
void A<T1>::bar(T1 t, T2 t2) 
^
In file included from main.cpp:3:0: 
A.h:8:10: error: candidate is: template<class T1> template<class T2> void A<T1>::bar(T1, T2) 
void bar(T1 t1, T2 t2); 

バーの宣言はどうすればいいですか? さらにもう1つの質問は、オブジェクトAを作成できるかどうかです。私はバーのT2のタイプを知らないのですか? barのコードはどのように生成されますか?

ありがとうございます。

答えて

0

ヘッダーの宣言は大丈夫です。関数定義のためにインラインファイルでこれを実行してみてください。

template<class T1> 
template<class T2> 
void A<T1>::bar(T1 t, T2 t2) { 
} 

これで解決され、コンパイルされ、ビルドされます。少なくともVisual Studio 2015コミュニティではそうです。

これは動作しません:

template<class T1, class T2> 
void A<T1>::bar(T1 t, T2 t2) { 
} 

をごヘッダの宣言はこのためにあなたのインライン関数の定義に一致していないので、あなたのクラステンプレート内のあなたのテンプレート関数を宣言した方法です:

template<class T2> 
void bar(T1 t, T2 t2); 

これは、なぜクラステンプレートに必要なtemplate<class T1>を宣言する必要があるのですか?その場合、クラステンプレート内で宣言したように、template<class T2>もテンプレート関数用に宣言する必要があります。

+0

returnステートメントがない場合、 'main'は暗黙的に0を返します。 – Brian

+0

@Brianは、通常、VSを使って、mainを含む値を返す関数の戻り値がないときに問題を出します。あるいは、少なくとも警告や古いバージョンでは不平を言って、私はちょうど戻り値のうわべに入った。 –

+0

なぜ賛成投票ですか? –

関連する問題