• <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 閱讀(364) 評論(0)  編輯 收藏 引用 所屬分類: Template
            <2010年8月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            常用鏈接

            留言簿(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

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久一区二区免费播放| 精品综合久久久久久888蜜芽| 伊人久久大香线蕉av一区| 2021少妇久久久久久久久久| 国产A三级久久精品| 久久午夜无码鲁丝片秋霞| 无码人妻少妇久久中文字幕| 国产精品99久久久久久董美香| 91精品国产综合久久婷婷| 99久久国产热无码精品免费| 国产成人精品久久二区二区| 91精品国产高清久久久久久io| 国产精品美女久久久| 久久夜色tv网站| 久久av高潮av无码av喷吹| 久久久国产精品| 久久精品国产亚洲αv忘忧草| 久久精品国产日本波多野结衣| 国产美女亚洲精品久久久综合| 色婷婷综合久久久久中文一区二区| 精品久久久久中文字幕日本| 久久97精品久久久久久久不卡| 国产精品欧美亚洲韩国日本久久| 久久久久久国产a免费观看不卡| 亚洲综合久久久| 99久久综合狠狠综合久久止| 久久国产精品二国产精品| 国产免费久久精品99re丫y| 少妇精品久久久一区二区三区 | 久久久久久极精品久久久| 久久久免费观成人影院| 久久综合给久久狠狠97色| 99热成人精品免费久久| 2019久久久高清456| 久久本道伊人久久| 精品久久久久久中文字幕大豆网| 精品久久久久久久| 久久午夜无码鲁丝片秋霞 | 亚洲AV伊人久久青青草原| 久久久一本精品99久久精品66| 品成人欧美大片久久国产欧美|