看板CompBook
标 题C++ Primer 答客问 (40) - static in template
发信站清华资讯(枫桥驿站) (Sat Mar 25 22:40:35 2000)
转信站Ptt!bbs.ee.ntu!freebsd.ntu!netnews.csie.nctu!news.cs.nthu!maple
C++ Primer 答客问 (40) - static in template
侯捷
[email protected]
2000.03.25 第一次发表於
清大.枫桥驿站(140.114.87.5).电脑书讯版(Computer/CompBook)
本文将於日後整理於 侯捷网站/侯捷译作/C++ Primer 中文版/答客问
侯捷网站:www.jjhou.com
----------------------------------------------------------------
s874105 wrote (2000/03/03) :
> 老师你好...
> 我有两个问题,一个是跟课内有关一个是我看书的问题。
>
> 假设今天有一个 class template
>
> template<typename T>
> class vi
> {
> static void func(T a) { cout << a << " "; }
> };
>
> 像这样的 static member function ... 可以成为 template 的一份子吗?
> 如果可以,是什麽道理呢?因为就我的想法中,
> static member 是要事先就先配置好。所以我怎麽想都想不出方法。
>
> 第二个问题有关於 cast
> 问题源自 Polymorphism in C++ (多型与虚拟) p164.
> 书里面写着
> char str[] = "Hello";
> char *pc = &str // error
>
> 错误讯息是 cannot convert form 'char (*)[6]' to 'char *' ...
> 那麽当 cout << str 时,operator<< 有支援 char (*)[6] 这种 type 吗?
> 还是输出时有先转型过呢?假设今天转型过後,他的型态被改变了,
> 对他本身的阵列会有什麽影响呢?如果没有影响,我实在不懂为什麽
> type 要设成 char (*)[6] 说...
> 因为我一直认为 operator<< 只支援 "char" & "int" & "float" & "double"...
> 这问题很笨,可是我一直搞不懂... 只好问一下老师了~ 谢谢...
侯捷回覆:
这问题不笨。只要思考过的问题,都不笨。
你的第一个问题,template 的 members 可否为 static。
如果只是想要确定可不可以,写个程式不就结了 :)
#include <iostream>
using namespace std;
template<typename T>
class C
{
public:
static void func() { cout << m_data << " "; }
C(T data) { m_data = data; }
private:
static T m_data;
};
// static data member initialization.(注意,很多人会忘记写这行)
template<typename T>
T C<T>::m_data;
int main()
{
C<int> c1(5);
C<float> c2(9.28);
C<char> c3('J');
c1.func(); // 5
c2.func(); // 9.28
c3.func(); // J
}
这个程式中的 class template 既有 static data member,也有
static member function。可顺利编译。执行结果也正确。
《C++ Primer 中文版》16.5 节「Class Templates 的 Static Data Members」
便是专讲这个题目。
我想你这个问题更有价值的是,你问:
> 如果可以,是什麽道理呢?因为就我的想法中,
> static member 是要事先就先配置好。所以我怎麽想都想不出方法。
你的说法不够精准,应该说:「static member 是独立於 class 之外配置的」。
修正成这样,你应该就不会有问题了。注意,template instantiation 是在
编译时期(而非执行时期)完成;面对 static members,编译器会为每一个
template instantiation 制作出一份相应的 static members。
所以上例的三个 instantiations,各有自己的一份 m_data 和一份 func()。
你的第二个问题:
char str[] = "Hello";
char *pc = &str; // error
这个问题,《多型与虚拟》书中说,必须写为这样才可编译:
char str[] = "Hello";
char *pc = (char*)&str; // 明白转型. 亦可利用 C++ cast operators.
你问:
> 那麽当 cout << str 时,operator<< 有支援 char (*)[6] 这种 type 吗?
有可能。
> 还是输出时有先转型过呢?
我不知道。也有可能。
> 假设今天转型过後,他的型态被改变了,
> 对他本身的阵列会有什麽影响呢?
没有影响。资料被转型,改变的是外界(也就是将它转型的人)对它
的「看法」,并不影响资料本身。
> 如果没有影响,我实在不懂为什麽
> type 要设成 char (*)[6] 说...
> 因为我一直认为 operator<< 只支援 "char" & "int" & "float" & "double"...
你一定忘了,C++ 允许 operator overloading(多载化运算子)。
-- the end
--
※ Origin: 枫桥驿站<bbs.cs.nthu.edu.tw> ◆ Mail: [email protected]