template<typename T, typename P>
class abc<T (*)(P)>
{
public:
abc()
{
printf("partial spec\r\n");
}
};
请问这是什么意思呢T (*)(P),这个模板类的类型为什么连在一起?
后面的代码是用
abc<void* (*)(int)> f_abc; 特化了一个类,但是意思是什么不明白。
15 个解决方案
#1
另外还有问题是我在看书的时候
template <class Iterator>
struct iterator_traits
{
typedef typename Iterator::value_type value_type;
};
我不明白typename的含义,百度过,说typename指明是一个类型,帮助编译器理解的作用,在后面的使用时,也需要加上typename,我没看懂,请高手能不能讲得更简单一点。
template <class Iterator>
struct iterator_traits
{
typedef typename Iterator::value_type value_type;
};
我不明白typename的含义,百度过,说typename指明是一个类型,帮助编译器理解的作用,在后面的使用时,也需要加上typename,我没看懂,请高手能不能讲得更简单一点。
#2
还有一个问题就是对于涉及到指针的算法,c++实现了
template <class Iterator>
struct iterator_traits
{
typedef typename Iterator::value_type value_type;
};
template <class T>
struct iterator_traits<T *>.....
template <class T>
struct iterator_traits<const T *>.....
第一个Iterator是什么意思?是个普通的类吗,还是有Iterator这个类。
template <class Iterator>
struct iterator_traits
{
typedef typename Iterator::value_type value_type;
};
template <class T>
struct iterator_traits<T *>.....
template <class T>
struct iterator_traits<const T *>.....
第一个Iterator是什么意思?是个普通的类吗,还是有Iterator这个类。
#3
这个叫偏特化,指的是模板的局部实例化的能力,偏特化的模板只拥有一个实例,而非隐式或显式实例化那样,拥有多个实例,主要目的是减少程序的体积。
#4
typename在这里的含义,是指出Iterator::value_type是一个类型,而非变量。
#5
那个Iterrator是一个模板参数。
楼主的模板基础远未过关,就是啃STL的源码,这怎么行呢?
#6
但是这种声明我还是不懂,主要是T (*)(P)是一种什么类型呢,中间没逗号,另外能讲解下为什么是偏特化吗,我觉得应该只是一个模板类的定义吧。对了把全部贴出来,这是我学的时候百度到的地址
http://blog.csdn.net/hi5000/article/details/7685726
代码是
#include <iostream>
#include <stdio.h>
template <typename T>
class abc
{
public:
abc()
{
printf("primary\r\n");
}
};
template<>
abc<int>::abc()
{
printf("member spec\r\n");
};
template<typename T, typename P>
class abc<T (*)(P)>
{
public:
abc()
{
printf("partial spec\r\n");
}
};
int main()
{
abc<void* (*)(int)> f_abc;
abc<int> i_abc;
system("pause");
return 0;
}
#7
我觉得偏特化应该是特化了一部分的类型,但是上面那个没有特化类型啊。
#8
谢谢讲解。
#9
T(*)(P)是函数指针类型,那个偏特化的意思是所有只有一个形参的函数的指针都使用这个实例。
楼主还是应该先学好模板基础,这些东西自然就明白了。
楼主还是应该先学好模板基础,这些东西自然就明白了。
#10
不是啃源码,在看泛型算法与stl这本书。你一说就明白了。。因为后面直接就说Iterator这个类定义了value_type类型,我也不知道iterator怎么实现的。。
#11
谢谢supermegaboy花时间讲解,对我帮助很大,打基础去了。。。
#12
同上,有时候typename不可或缺,如下:
template <class T>
class MyClass
{
typename T::SubType * ptr;
.........
}
这里,typename指出SubType是Class T中定义的一个型别,因此ptr是一个指向 T::SubType型别的指针,如果没有关键字typename,SubType会被当成一个static成员,于是T::SubType * ptr就会被解释成乘法表达式。
c++的一般规则是,除了以typename修饰之外,template内的任何标识符号都被视为一个值而非一个型别。
template <class T>
class MyClass
{
typename T::SubType * ptr;
.........
}
这里,typename指出SubType是Class T中定义的一个型别,因此ptr是一个指向 T::SubType型别的指针,如果没有关键字typename,SubType会被当成一个static成员,于是T::SubType * ptr就会被解释成乘法表达式。
c++的一般规则是,除了以typename修饰之外,template内的任何标识符号都被视为一个值而非一个型别。
#13
建议楼主看下<<effective c++>> 第25和42条款,它们告诉你为什么要偏特化和typename.
建议楼主看<<c++标准程序库>>,如何看起来很吃力可以先看<<Essential C++中文版>>。
建议楼主看<<c++标准程序库>>,如何看起来很吃力可以先看<<Essential C++中文版>>。
#14
谢谢讲解,讲的非常清晰。。
#15
好的,查书辛苦了,我主要是想学着使用c++的stl,c++的面向对象和c的语法基础的都懂,看到不懂的内容习惯先百度下别人的博客怎么讲解的然后再来csdn提问。
#1
另外还有问题是我在看书的时候
template <class Iterator>
struct iterator_traits
{
typedef typename Iterator::value_type value_type;
};
我不明白typename的含义,百度过,说typename指明是一个类型,帮助编译器理解的作用,在后面的使用时,也需要加上typename,我没看懂,请高手能不能讲得更简单一点。
template <class Iterator>
struct iterator_traits
{
typedef typename Iterator::value_type value_type;
};
我不明白typename的含义,百度过,说typename指明是一个类型,帮助编译器理解的作用,在后面的使用时,也需要加上typename,我没看懂,请高手能不能讲得更简单一点。
#2
还有一个问题就是对于涉及到指针的算法,c++实现了
template <class Iterator>
struct iterator_traits
{
typedef typename Iterator::value_type value_type;
};
template <class T>
struct iterator_traits<T *>.....
template <class T>
struct iterator_traits<const T *>.....
第一个Iterator是什么意思?是个普通的类吗,还是有Iterator这个类。
template <class Iterator>
struct iterator_traits
{
typedef typename Iterator::value_type value_type;
};
template <class T>
struct iterator_traits<T *>.....
template <class T>
struct iterator_traits<const T *>.....
第一个Iterator是什么意思?是个普通的类吗,还是有Iterator这个类。
#3
这个叫偏特化,指的是模板的局部实例化的能力,偏特化的模板只拥有一个实例,而非隐式或显式实例化那样,拥有多个实例,主要目的是减少程序的体积。
#4
typename在这里的含义,是指出Iterator::value_type是一个类型,而非变量。
#5
那个Iterrator是一个模板参数。
楼主的模板基础远未过关,就是啃STL的源码,这怎么行呢?
#6
但是这种声明我还是不懂,主要是T (*)(P)是一种什么类型呢,中间没逗号,另外能讲解下为什么是偏特化吗,我觉得应该只是一个模板类的定义吧。对了把全部贴出来,这是我学的时候百度到的地址
http://blog.csdn.net/hi5000/article/details/7685726
代码是
#include <iostream>
#include <stdio.h>
template <typename T>
class abc
{
public:
abc()
{
printf("primary\r\n");
}
};
template<>
abc<int>::abc()
{
printf("member spec\r\n");
};
template<typename T, typename P>
class abc<T (*)(P)>
{
public:
abc()
{
printf("partial spec\r\n");
}
};
int main()
{
abc<void* (*)(int)> f_abc;
abc<int> i_abc;
system("pause");
return 0;
}
#7
我觉得偏特化应该是特化了一部分的类型,但是上面那个没有特化类型啊。
#8
谢谢讲解。
#9
T(*)(P)是函数指针类型,那个偏特化的意思是所有只有一个形参的函数的指针都使用这个实例。
楼主还是应该先学好模板基础,这些东西自然就明白了。
楼主还是应该先学好模板基础,这些东西自然就明白了。
#10
不是啃源码,在看泛型算法与stl这本书。你一说就明白了。。因为后面直接就说Iterator这个类定义了value_type类型,我也不知道iterator怎么实现的。。
#11
谢谢supermegaboy花时间讲解,对我帮助很大,打基础去了。。。
#12
同上,有时候typename不可或缺,如下:
template <class T>
class MyClass
{
typename T::SubType * ptr;
.........
}
这里,typename指出SubType是Class T中定义的一个型别,因此ptr是一个指向 T::SubType型别的指针,如果没有关键字typename,SubType会被当成一个static成员,于是T::SubType * ptr就会被解释成乘法表达式。
c++的一般规则是,除了以typename修饰之外,template内的任何标识符号都被视为一个值而非一个型别。
template <class T>
class MyClass
{
typename T::SubType * ptr;
.........
}
这里,typename指出SubType是Class T中定义的一个型别,因此ptr是一个指向 T::SubType型别的指针,如果没有关键字typename,SubType会被当成一个static成员,于是T::SubType * ptr就会被解释成乘法表达式。
c++的一般规则是,除了以typename修饰之外,template内的任何标识符号都被视为一个值而非一个型别。
#13
建议楼主看下<<effective c++>> 第25和42条款,它们告诉你为什么要偏特化和typename.
建议楼主看<<c++标准程序库>>,如何看起来很吃力可以先看<<Essential C++中文版>>。
建议楼主看<<c++标准程序库>>,如何看起来很吃力可以先看<<Essential C++中文版>>。
#14
谢谢讲解,讲的非常清晰。。
#15
好的,查书辛苦了,我主要是想学着使用c++的stl,c++的面向对象和c的语法基础的都懂,看到不懂的内容习惯先百度下别人的博客怎么讲解的然后再来csdn提问。