免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4618 | 回复: 15
打印 上一主题 下一主题

请教一个模板偏特化的问题,真是难以理解啊 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-10 16:23 |只看该作者 |倒序浏览
#include <iostream>

class test
{
    public:

        template<class T>
        void print()
        {
            std::cout << "11";
        }

        template<>
        void print<std::string>()
        {
            std::cout << "22";
        }
};

int main()
{
    test t;
    t.print<std::string>();
    return 0;
}

这段代码用VS2005可以编译通过,运行也是正确的
可以试Solaris下编译失败,报错如下:
"test.cpp", line 14: Error: explicit specialization is not allowed in the current scope.

有人知道怎么修改吗?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2012-01-10 16:52 |只看该作者
正确写法:
  1. #include <iostream>

  2. class test
  3. {
  4.     public:
  5.         template<class T>
  6.         void print()
  7.         {
  8.             std::cout << "11";
  9.         }
  10. };

  11. template<>
  12. inline void test::print<std::string>()
  13. {
  14.         std::cout << "22";
  15. }

  16. int main()
  17. {
  18.     test t;
  19.     t.print<int>();
  20.     t.print<std::string>();
  21.     return 0;
  22. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-01-10 16:57 |只看该作者
说明vs。。。。。。。

论坛徽章:
0
4 [报告]
发表于 2012-01-10 18:43 |只看该作者
这么写是可以编过,为什么呢?

bruceteen 发表于 2012-01-10 16:52
正确写法:

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2012-01-10 23:47 |只看该作者
因为
template<> void test::print<std::string>()

template<class  T> void test::print()
一个特化

也就是
template<class  T> void test::print() 这种声明
已经包含了
template<> void test::print<std::string>() 这种声明

你不能在类中包含重复的函数声明

论坛徽章:
0
6 [报告]
发表于 2012-01-11 11:27 |只看该作者
我发现这段代码在hp下gcc编译不过

太悲剧了,跨平台的模板代码太难写了

回复 2# bruceteen


   

论坛徽章:
0
7 [报告]
发表于 2012-01-11 12:10 |只看该作者
比如这样的代码在gcc下死活编译不过,报错
test.cpp:13: error: invalid application of 'sizeof' to incomplete type 'test_un'

#include <string>
#include <iostream>

struct test_un;

class test
{
    public:
    template<class T>
        void print()
        {
            sizeof(test_un);
        }
};

template<>
inline void test::print<std::string>()
{
    std::cout << "22" << std::endl;
}

int main()
{
    test t;
    t.print<std::string>();
    return 0;
}

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
8 [报告]
发表于 2012-01-11 14:35 |只看该作者
mlmzw 发表于 2012-01-11 12:10
比如这样的代码在gcc下死活编译不过,报错
test.cpp:13: error: invalid application of 'sizeof' to inco ...

逻辑上就不通,test_un是个不完全类型。化简后如下

struct test_un;

int main()
{
    sizeof(test_un);

    return 0;
}

肯定编译不通过嘛

论坛徽章:
0
9 [报告]
发表于 2012-01-12 15:31 |只看该作者
WINDOWS平台下是可以编译通过的

BOOST库提供了一个宏BOOST_STATIC_ASSERT就是利用sizeof(不完整定义类型)来实现编译期检查的

我以为类模板实例化和函数模板实例化是一样的,只有碰到正确的类型时,才会实例化,但是GCC貌似不是这么处理的

比如下面的代码
template<bool x>
struct test_un;

template<>
struct test_un<true> {enum{value = 1};};

int main()
{
    test_un<false> t;  //编译通不过   
   test_un<true> t;   //编译通过
}

回复 8# bruceteen


   

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
10 [报告]
发表于 2012-01-12 15:44 |只看该作者
mlmzw 发表于 2012-01-12 15:31
WINDOWS平台下是可以编译通过的

BOOST库提供了一个宏BOOST_STATIC_ASSERT就是利用sizeof(不完整定义类型 ...


这是啥意思啊, false 还有应该能够编译的过理由???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP