关于C++模版的一个问题求教,如果取模板类内的一个结构体的指针。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C++模版的一个问题求教,如果取模板类内的一个结构体的指针。相关的知识,希望对你有一定的参考价值。

template <class T>
class A

public:
struct B

T t;
;
B* GetB();
private:
B* pB;
;

template <class T>
A<T>::B* A<T>::GetB()

return this->pB;


在VS2005编译的时候会报
错误 2 error C2143: 语法错误 : 缺少“;”(在“*”的前面)
错误 3 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认
错误 4 fatal error C1903: 无法从以前的错误中恢复;正在停止编译
,求问谁知道怎么解决吗?

实际就是不认识A<T>::B*是什么。
我知道把B拿出去可以通过, 但这个代码其实是从MS Speech SDK的示例中抽出来的一段
,然后我把它简化了, 但我不希望改原来的代码结构. 原例子是:
我认为应该是编译器版本的差异导致的, 而且已经直接通过修改工程属性参数,纠正了一些会报编译错误的地方.

/ CSPList<TYPE, ARG_TYPE>

template<class TYPE, class ARG_TYPE>
class CSPList

protected:
struct CNode

CNode* pNext;
CNode* pPrev;
TYPE data;
;
public:
.....
CNode* NewNode(CNode*, CNode*);
......


template<class TYPE, class ARG_TYPE>
CSPList<TYPE, ARG_TYPE>::CNode*
CSPList<TYPE, ARG_TYPE>::NewNode(CSPList::CNode* pPrev, CSPList::CNode* pNext)

......

B结构也要模板化。

template <class T> struct B

T t;
;

template <class T>
class A

public:
B<T>* GetB();
private:
B<T>* pB;
;

template <class T>
B<T>* A<T>::GetB()

return this->pB;


void main()

参考技术A #include<iostream>
using namespace std;
template <class T>
struct B

T t;
;
template <class T1>
class A

public:
B<T1>* GetB();
private:
B<T1>* pB;
;

template <class T1>
B<T1>* A<T1>::GetB()

return this->pB;

int main()

A<int> a;
B<int>* b;
b=a.GetB();
cout<<b<<endl;
return 0;
参考技术B 我用VC6.0编译,连接,运行都OK啊,没错误。

仿函数和模版的模板参数

之后我在整理之后会把类型萃取也放着这个文章里面,我自己还是满容易混淆的,经常分不清、

模版的模板参数主要使用在类的类成员也是个模板类,当你想只输入一个模板参数,就可以同时对类内的其他类成员传入相同的模板参数的时候就可以使用咯

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 
 6 
 7 template<class T>
 8 class class1
 9 {
10                  T a;
11 };
12 
13 template < class T, template< class> class class1 >
14 class class2
15 {
16                  T b;
17                  class1<T> c;
18 };

这个就是模板的模版参数的一个简单实现,用来实现类的类成员和该类模板使用类型一致的方法

 

 

 

那什么是仿函数呢,仿函数是STL库中经常使用的一种手法

仿函数可以通过结构体内部定义一些operator()实现一种类似函数的方法,通过模板传参就可以使用,仿函数并不是真正的函数,是通过模板和结构体(或者是类)实现的,类似函数的体制,仿函数可以用在代码的重用上,可以减少冗余的部分代码,例如可以将比较大小整合成一个仿函数,在使用的时候就可以省去很多代码
 1 template<class K>
 2 struct HashFuncer
 3 {
 4     size_t operator()(const K& key,size_t capacity)
 5     {
 6         return key%capacity;
 7     }
 8 };
 9 
10 template<>
11 struct HashFuncer<string>
12 {
13     static size_t BKDRHash(const char *s)
14     {
15         unsigned int seed = 131;
16         unsigned hash = 0;
17         while (*s)
18         {
19             hash = hash*seed + (*s++);
20 
21         }
22         return (hash & 0x7FFFFFFF);//八成是想取个正数
23     }
24     size_t operator()(const string &key, size_t _capacity)
25     {
26         return BKDRHash(key.c_str())%_capacity;
27     }
28 };
29 
30 
31 
32 
33 
34 template<class K,class V,class HashFun=HashFuncer<K>>
35 class HashTable
36 {
37 };

这里贴出我写的哈希表的部分代码,这里就是用了仿函数,目的是处理不同的结构,当哈希表存入的是int类型,和当哈希表存入的是string类型时,调用的仿函数是不同的(我对仿函数的模板进行了特化),下边贴一下调用仿函数的代码

 1 size_t HashFuner(const K& key,size_t capacity)

2 {

3   return HashFun()(key, capacity);

4 } 

因为HashFun是一个结构体,所以构造一个匿名变量调用operator()方法,再进行封装

这样看起来就跟函数差不多了,不是么

以上是关于关于C++模版的一个问题求教,如果取模板类内的一个结构体的指针。的主要内容,如果未能解决你的问题,请参考以下文章

c++中对象类内的对象映射

在C ++中的类内的变量之间传递数据[关闭]

C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值

OpenCV在限定的ROI中进行模版匹配问题,求指点!!

设计模式-(Memento)在不破坏封装性的前提下,捕捉类内的一个状态信息,并根据这个信息进行恢复。

C++ OpenCV模版匹配