• <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
            <2010年4月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            常用鏈接

            留言簿(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)論排行榜

            一本一本久久aa综合精品 | 久久国产高清一区二区三区| 青青草原综合久久| 伊色综合久久之综合久久| 国产精品视频久久久| 精品久久久久中文字幕一区| 伊人久久五月天| 91久久香蕉国产熟女线看| 免费无码国产欧美久久18| 国产成人精品久久免费动漫| 性高朝久久久久久久久久| 99久久er这里只有精品18| 伊人 久久 精品| 国产精品免费久久| 久久久久高潮毛片免费全部播放 | 精品久久久久久久国产潘金莲 | 久久久一本精品99久久精品66| 国产精品va久久久久久久| 久久国产乱子伦免费精品| 亚洲人成无码www久久久| 久久精品成人免费国产片小草 | 久久久无码精品亚洲日韩京东传媒| aaa级精品久久久国产片| 无码人妻久久一区二区三区免费丨| 久久综合给合综合久久| 伊人色综合久久| 久久综合九色综合欧美狠狠| 久久亚洲AV成人无码国产| 亚洲人成电影网站久久| 日本加勒比久久精品| 久久91精品综合国产首页| 中文字幕久久欲求不满| 亚洲国产精品久久66| 91精品国产91久久久久久| 久久精品国产亚洲麻豆| 精品国产一区二区三区久久久狼| 奇米综合四色77777久久| 久久久国产精品亚洲一区 | 久久亚洲中文字幕精品一区四| 狠狠色综合久久久久尤物| 欧美亚洲日本久久精品|