• <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 閱讀(371) 評論(0)  編輯 收藏 引用 所屬分類: Template
            <2010年4月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

            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

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品久久久99| 久久久久久久久无码精品亚洲日韩 | 精品无码久久久久久国产| 欧美久久天天综合香蕉伊| 国产精品乱码久久久久久软件| 国产精品久久久久a影院| 91久久精一区二区三区大全| 久久黄视频| 9久久9久久精品| 99精品国产综合久久久久五月天| 久久久久女人精品毛片| 亚洲一本综合久久| 无码伊人66久久大杳蕉网站谷歌| 久久99精品国产麻豆蜜芽| 色欲久久久天天天综合网| 久久久WWW成人免费精品| 久久无码人妻一区二区三区午夜| 久久中文字幕视频、最近更新| 日韩精品久久无码人妻中文字幕| 久久精品国产欧美日韩| 91亚洲国产成人久久精品网址| 亚洲国产精品无码久久一线 | 国产精品久久国产精麻豆99网站| 香蕉aa三级久久毛片| 久久久WWW成人免费毛片| 久久精品视频网| 国产99精品久久| 国产精品久久久久久福利69堂| 中文字幕日本人妻久久久免费| 亚洲欧洲久久av| 性做久久久久久久久老女人| 久久婷婷人人澡人人| 久久精品成人免费观看97| 久久国产成人精品国产成人亚洲| 国产精品青草久久久久婷婷| 97热久久免费频精品99| .精品久久久麻豆国产精品| 久久精品国产99国产电影网| 国产精品99精品久久免费| 久久国产精品99国产精| 久久噜噜电影你懂的|