首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

系列C++有关问题之六:vector<string> & Bridge Pattern

2012-02-13 
系列C++问题请教高手之六:vectorstring & Bridge Pattern请教各位高手:我学C++模板作了一个练习所有源代

系列C++问题请教高手之六:vector<string> & Bridge Pattern
请教各位高手:我学C++模板作了一个练习所有源代码如下:有三个地方有问题如注释所注:对于前两个问题请问为什么,对于第三个问题请问应该怎么改?

#include   "iostream "
#include   "string.h "
#include   <vector>
#include   <algorithm>

using   namespace   std;

template <class   T>   class   n_Sum;

template <class   T>   class   n_Sum_Implt
{
T   sum;
friend   class   n_Sum   <T> ;

public:

//加上下面这个构造函数代码运行时会错--   Access   Violation.
n_Sum_Implt(T   i=0):sum(i)
{
}

void   operator()(const   T&   value)
{
sum   +=   value;
}
};


template <class   T>   class   n_Sum
{
T   sum;
n_Sum_Implt <T> *   pn_Sum_Implt;
public:

//加上下面这个构造函数代码运行时会错--   Access   Violation.

        n_Sum(T   i=0):sum(i)
{
}

void   SetImplentPtr(n_Sum_Implt <T> *   pImplt)
{
pn_Sum_Implt   =   pImplt;
}

void   operator()(const   T&   x)
{
pn_Sum_Implt-> operator()   (x);
}

T   result()   const
{
return   pn_Sum_Implt-> sum;
}
};

ostream&   operator   < <   (ostream&   os1,   const   string&   inputstr1)
{
os1 < <inputstr1.c_str();
return   os1;
};


int   main()
{    

int   i;
//下面这个定义,vector好像要带多个参数,编译时很多警告
vector <   string   >   vs;

n_Sum <string>   sum;
n_Sum_Implt <string>   sumImplt;
string   str1( "Hello ");
string   str2( "   World! ");
vs.push_back(str1);
vs.push_back(str2);
sum.SetImplentPtr(&sumImplt);

for_each(vs.begin(),   vs.end(),   sum);
cout < < "After   concatenated: " < <sum.result() < <endl;
return   0;  
}

[解决办法]
//加上下面这个构造函数代码运行时会错-- Access Violation.
n_Sum_Implt(T i=T() ):sum(i) <========改成这样,你怎么知道初始化一定是0 呢?
{
}
两个地方都是如此

第三个问题
你是用vc6吧,有警告很正常,换用其他编译器吧.
[解决办法]
就是
你杂知道i的类型啊
你用的模版撒

直接n_Sum_Implt(T i):sum(i)
{
}

也可以撒
[解决办法]
如果你的i是其他类型的,如string,char *的呢?
[解决办法]
第三个问题我来回答: 你用g++,string是标准c++的string,但你没有包含其头文件 <string> ,而是包含
c语言的 "string.h ",所以有警告,有时候可能还会报错.

热点排行
Bad Request.