系列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 ",所以有警告,有时候可能还会报错.