2017-08-05 5 views
2

C++では、子クラスまたはフレンド関数が、親クラスのすべてのテンプレートタイプにどのようにアクセスできるのでしょうか?どのようにタイプTであっても、friend関数と子関数は型エラーを起こさないように、以下のコードをどのように変更すればよいですか? (現在、intの型だけが適切に動作します)。C++テンプレートクラスの子/友人にテンプレートを適用するにはどうすればよいですか?

// PARENT CLASS:¨ 

template <class T> 
class parent{ 
public: 
    T variable1; 

    friend int function1(parent, int a); 
}; 


//CHILD CLASS: 

class child : public parent<int> { 
public: 
    void setvariable(int a){ variable1 = a; }; 

}; 


// FRIEND FUNCTION: 

int function1(parent<int> k, int a) { 
    return k.variable1 +a; 
}; 

だから、その後エラーなしでコンパイルします以下:

int main() { 
    child child1;    //Child 
    child child2; 

    child1.setvariable(4); 
    child2.setvariable(4.4); //Type error/retyping 

    cout << function1(child1.variable1, 4) << endl;  // Function 
    cout << function1(child2.variable1, 4.0) << endl; // Type error 

    system("pause"); 
    return 1; 
} 
+0

[テンプレートクラスのテンプレートフレンド機能の宣言]の可能な複製(https://stackoverflow.com/questions/18792565/declare-template-friend-function-of-template-class) – AndyG

+1

コードの例を表示できますかあなたは持っていたいですか?たとえば、function1の定義ですか?私には、あなたが求めているものは不明です。 – Jonas

+0

@ Jonas関数の定義は、2行目から最後の行にあります。 – Tony

答えて

1

これにより、friend関数はすべての派生型に対してvariable1にアクセスできます。

//Parent 
template <class T> 
class parent{ 
public: 
    template<typename U> 
    friend U function1(parent<U>& parent, U a); 

private: 
    T variable1; 
}; 


//Child 
class child : public parent<int> { 
public: 
    void setvariable(int a){ variable1 = a; }; 
}; 


//Friend 
template<typename U> 
U function1(parent<U>& k, U a) { 
    return k.variable1 + a; 
}; 
+0

はい; )完璧です。 – Tony

0

私はあなたが達成しようとするものを全くわからないんだけど、私は、これはあなたが望むことができると思います。

childクラスとfunction1は現在テンプレートであり、function1の最初のパラメータは参照です。

テンプレートパラメータは、childオブジェクトをインスタンス化するときに明示的に設定されます。

#include <iostream> 
using namespace std; 
template <class T> 
class parent{ 
public: 
    T variable1; 

template <class U> 
    friend U function1(parent<U>&, U a); // now a template, using U to avoid shadowing 
}; 

//CHILD CLASS: 
template <class T> // now a template 
class child : public parent<T> { 
public: 
    void setvariable(T a){ this->variable1 = a; }; // using 'this' pointer because the function is a template now 
}; 

// FRIEND FUNCTION: 
template <class T> // now a template 
T function1(parent<T>& k, T a) { // first parameter is a reference, for polymorphism to work 
    return k.variable1 +a; 
}; 

int main() { 
    child<int> child1; // T = int 
    child<double> child2; // T = double 

    child1.setvariable(4); 
    child2.setvariable(4.4); 

    cout << function1(child1, 4) << endl; // first parameter is child1, and not the member variable 
    cout << function1(child2, 4.0) << endl; // first parameter is child2 
} 
+0

はい、これは質問の1つの特定の解釈のための解決策です。 :) –

1

フレンド関数の定義は、クラス定義の内部で使用できます

template <class T> 
class parent{ 
public: 
    T variable1; 

    friend T function1(parent k, T a) { 
     return k.variable1 + a; 
    } 
}; 

この関数はそうプロモーション/ A変換が可能にテンプレートされていません。

+0

非常に興味深いですが、クラス宣言と関数宣言の間に関数の実装を書くことと外部との間には基本的に違いはありませんでした。 – Tony

+0

それは、テンプレートがテンプレートではなく、各テンプレートに対してテンプレートを定義する唯一の方法です。 – Jarod42

関連する問題