您的位置:程序门 -> c/c++ -> c++ 语言



vc8到gcc移植问题:模板类中的成员模板函数在全局模板函数中无法调用


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


vc8到gcc移植问题:模板类中的成员模板函数在全局模板函数中无法调用[已结贴,结贴人:ufouser]
发表于:2008-01-22 10:26:05 楼主
c/c++ code
#include <iostream> using namespace std; struct xyz { int x; }; template <class s> class sometemplateclass { public: template <class t> t* sometemplatememberfunc(void) { return (t*)(data); } void* data; }; // ok on g++, ok on vc2005 void somenontemplateglobalfunc(const xyz& data) { sometemplateclass<xyz> v; v.data =void*)&(data.x); int* result = v.sometemplatememberfunc<int>(); cout << "in somenontemplateglobalfunc()\n" << "data = " << *result << endl; } // error on g++, ok on vc2005 template <class s> void sometemplateglobalfunc(const s& data) { sometemplateclass<s> v; v.data =void*)&(data.x); int* result = v.sometemplatememberfunc<int>(); cout << "in sometemplateglobalfunc()\n" << "data = " << *result << endl; } int main() { cout << "begin..." << endl; xyz x; x.x = 666; somenontemplateglobalfunc(x); // ok on g++, ok on vc2005 sometemplateglobalfunc(x); // error on g++, ok on vc2005 cout << "end..." << endl; return 0; }


上述代码在vc2005中ok,但在gcc(g++)中出错:
test.cpp:   in   function   ‘void   sometemplateglobalfunc(const   s&)':
test.cpp:39:   error:   expected   primary-expression   before   ‘int'
test.cpp:39:   error:   expected   ‘,'   or   ‘;'   before   ‘int'

请高手点拨
发表于:2008-01-22 10:27:141楼 得分:0
版本:gcc   version   4.1.2   20070626   (red   hat   4.1.2-13)
发表于:2008-01-22 11:06:592楼 得分:0
自己顶一顶:)
发表于:2008-01-22 11:12:303楼 得分:5
召唤   taodm
发表于:2008-01-22 11:24:594楼 得分:25
#include   <iostream>
using   namespace   std;

struct   xyz
{
        int         x;
};

template   <class   s>
class   sometemplateclass
{
public:

        template   <class   t>
        t*   sometemplatememberfunc(void)
        {
                return   (t*)(data);
        }

        void*   data;
};

//   ok   on   g++,   ok   on   vc2005
void   somenontemplateglobalfunc(const   xyz&   data)
{
                sometemplateclass <xyz>   v;
                v.data   =   (void*)&(data.x);
                int*   result   =   v.sometemplatememberfunc <int> ();
                cout   < <   "in   somenontemplateglobalfunc()\n"
                        < <   "data   =   "   < <   *result   < <   endl;
}

//   error   on   g++,   ok   on   vc2005
template   <class   s>
void   sometemplateglobalfunc(const   s&   data)
{
        sometemplateclass <s>   v;
        v.data   =   (void*)&(data.x);
        int*   result   =   v.template   sometemplatememberfunc <int> ();
        cout   < <   "in   sometemplateglobalfunc()\n"
                < <   "data   =   "   < <   *result   < <   endl;
}


int   main()
{
        cout   < <   "begin..."   < <   endl;
       
        xyz   x;
        x.x   =   666;

        somenontemplateglobalfunc(x);         //   ok   on   g++,   ok   on   vc2005
        sometemplateglobalfunc(x);                 //   error   on   g++,   ok   on   vc2005
       

        cout   < <   "end..."   < <   endl;
        return   0;
}
发表于:2008-01-22 11:30:185楼 得分:0
多谢了     果然牛x
顺便问一下   可否透露一下这些神奇知识写在哪些书里了?
发表于:2008-01-22 11:39:306楼 得分:20
如果精力足够旺盛,看《c++   templates》
发表于:2008-01-22 12:00:387楼 得分:0
http://dl1.csdn.net/down3/20070507/07170446473.pdf

14.2
发表于:2008-01-22 12:17:338楼 得分:0
好书!
再次感谢各位在模板方面的指导!


快速检索

最新资讯
热门点击