• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 297,  comments - 15,  trackbacks - 0
            Class templates can have friends. A class or class template, function, or function template can be a friend to a template class. Friends can also be specializations of a class template or function template, but not partial specializations.

            Example
            In the following example, a friend function is defined as a function template within the class template. This code produces a version of the friend function for every instantiation of the template. This construct is useful if your friend function depends on the same template parameters as the class does.

            // template_friend1.cpp
            // compile with: /EHsc

            #include <iostream>
            using namespace std;

            template <class T> class Array {
            T* array;
            int size;

            public:
            Array(int sz): size(sz) {
            array = new T[size];
            memset(array, 0, size * sizeof(T));
            }

            Array(const Array& a) {
            size = a.size;
            array = new T[size];
            memcpy_s(array, a.array, sizeof(T));
            }

            T& operator[](int i) {
            return *(array + i);
            }

            int Length() { return size; }

            void print() {
            for (int i = 0; i < size; i++)
            cout << *(array + i) << " ";

            cout << endl;
            }

            template<class T>
            friend Array<T>* combine(Array<T>& a1, Array<T>& a2);
            };

            template<class T>
            Array<T>* combine(Array<T>& a1, Array<T>& a2) {
            Array<T>* a = new Array<T>(a1.size + a2.size);
            for (int i = 0; i < a1.size; i++)
            (*a)[i] = *(a1.array + i);

            for (int i = 0; i < a2.size; i++)
            (*a)[i + a1.size] = *(a2.array + i);

            return a;
            }

            int main() {
            Array<char> alpha1(26);
            for (int i = 0 ; i < alpha1.Length() ; i++)
            alpha1[i] = 'A' + i;

            alpha1.print();

            Array<char> alpha2(26);
            for (int i = 0 ; i < alpha2.Length() ; i++)
            alpha2[i] = 'a' + i;

            alpha2.print();
            Array<char>*alpha3 = combine(alpha1, alpha2);
            alpha3->print();
            delete alpha3;
            }
            A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
            a b c d e f g h i j k l m n o p q r s t u v w x y z
            A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z

            The next example involves a friend that has a template specialization. A function template specialization is automatically a friend if the original function template is a friend.

            It is also possible to declare only the specialized version of the template as the friend, as the comment before the friend declaration in the following code indicates. If you do this, you must put the definition of the friend template specialization outside of the template class.


            // template_friend2.cpp
            // compile with: /EHsc
            #include <iostream>
            using namespace std;

            template <class T>
            class Array;

            template <class T>
            void f(Array<T>& a);

            template <class T> class Array
            {
            T* array;
            int size;

            public:
            Array(int sz): size(sz)
            {
            array = new T[size];
            memset(array, 0, size * sizeof(T));
            }
            Array(const Array& a)
            {
            size = a.size;
            array = new T[size];
            memcpy_s(array, a.array, sizeof(T));
            }
            T& operator[](int i)
            {
            return *(array + i);
            }
            int Length()
            {
            return size;
            }
            void print()
            {
            for (int i = 0; i < size; i++)
            {
            cout << *(array + i) << " ";
            }
            cout << endl;
            }
            // If you replace the friend declaration with the int-specific
            // version, only the int specialization will be a friend.
            // The code in the generic f will fail
            // with C2248: 'Array<T>::size' :
            // cannot access private member declared in class 'Array<T>'.
            //friend void f<int>(Array<int>& a);

            friend void f<>(Array<T>& a);
            };

            // f function template, friend of Array<T>
            template <class T>
            void f(Array<T>& a)
            {
            cout << a.size << " generic" << endl;
            }

            // Specialization of f for int arrays
            // will be a friend because the template f is a friend.
            template<> void f(Array<int>& a)
            {
            cout << a.size << " int" << endl;
            }

            int main()
            {
            Array<char> ac(10);
            f(ac);

            Array<int> a(10);
            f(a);
            }
            10 generic
            10 int
            The next example shows a friend class template declared within a class template. The class template is then used as the template argument for the friend class. Friend class templates must be defined outside of the class template in which they are declared. Any specializations or partial specializations of the friend template are also friends of the original class template.

            // template_friend3.cpp
            // compile with: /EHsc
            #include <iostream>
            using namespace std;

            template <class T>
            class X
            {
            private:
            T* data;
            void InitData(int seed) { data = new T(seed); }
            public:
            void print() { cout << *data << endl; }
            template <class U> friend class Factory;
            };

            template <class U>
            class Factory
            {
            public:
            U* GetNewObject(int seed)
            {
            U* pu = new U;
            pu->InitData(seed);
            return pu;
            }
            };

            int main()
            {
            Factory< X<int> > XintFactory;
            X<int>* x1 = XintFactory.GetNewObject(65);
            X<int>* x2 = XintFactory.GetNewObject(97);

            Factory< X<char> > XcharFactory;
            X<char>* x3 = XcharFactory.GetNewObject(65);
            X<char>* x4 = XcharFactory.GetNewObject(97);
            x1->print();
            x2->print();
            x3->print();
            x4->print();
            }
            65
            97
            A
            a
            from:
            http://msdn.microsoft.com/en-us/library/f1b2td24.aspx


            posted on 2010-04-17 23:33 chatler 閱讀(373) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Template
            <2009年11月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久婷婷人人澡人人爽人人爱| 97久久综合精品久久久综合| 女同久久| 欧美一区二区三区久久综合 | 久久精品中文字幕一区| 久久这里只有精品首页| 韩国免费A级毛片久久| 久久亚洲国产精品五月天婷| 国产三级久久久精品麻豆三级| 精品久久久久国产免费| 无码AV中文字幕久久专区| 久久93精品国产91久久综合| 漂亮人妻被黑人久久精品| 久久亚洲电影| 久久精品国产99久久丝袜| 99久久中文字幕| 伊人色综合久久天天人手人婷| 很黄很污的网站久久mimi色| 精品人妻久久久久久888| 久久夜色精品国产噜噜亚洲a| 99久久婷婷国产综合精品草原| 久久香蕉国产线看观看精品yw| 伊人久久大香线蕉综合5g| 久久亚洲中文字幕精品一区四| 国产福利电影一区二区三区久久老子无码午夜伦不 | 囯产精品久久久久久久久蜜桃 | 久久久久亚洲精品无码网址| 国产一级持黄大片99久久| 国产成人精品久久| 久久人人添人人爽添人人片牛牛 | 久久国产精品-国产精品| 无码人妻久久一区二区三区| 精品久久久无码21p发布| 久久精品国产欧美日韩99热| 热RE99久久精品国产66热| 亚洲人AV永久一区二区三区久久| 久久久青草青青国产亚洲免观| 久久精品国产亚洲7777| 亚洲国产成人久久综合一区77| 一本久道久久综合狠狠躁AV| 亚洲香蕉网久久综合影视|