C++ 模板类的构造函数问题
很简单的问题。#include<stdio.h>template<classT>classabc{public:abc(Tab){m_abc=ab;}Tget(){ret...
很简单的问题。
#include <stdio.h>
template <class T> class abc
{
public:
abc(T ab)
{
m_abc=ab;
}
T get()
{
return m_abc;
}
private:
T m_abc;
};
void main()
{
abc<int> a(123);
printf("%d\n",a.get());
}
上面的测试成功了,但如果我把类的定义放到外面:
#include <stdio.h>
template <class T> class abc
{
public:
abc(T ab);
T get();
private:
T m_abc;
};
abc::abc(T ab)
{
m_abc=ab;
}
T abc::get()
{
return m_abc;
}
void main()
{
abc<int> a(123);
printf("%d\n",a.get());
}
就会错误连天,是那些地方写错了?
问题解决了,谢谢1楼的,
还有个问题:
如果类里的函数这么声明:
abc& get()
{
return *this;
}
在外部应该怎么写?
也就是返回引用。
非常感谢4楼的回答者,我是为了节省时间加上说明的准确,随便举的例子;一些小的功能我尽量用C中的函数,执行效率更快。 展开
#include <stdio.h>
template <class T> class abc
{
public:
abc(T ab)
{
m_abc=ab;
}
T get()
{
return m_abc;
}
private:
T m_abc;
};
void main()
{
abc<int> a(123);
printf("%d\n",a.get());
}
上面的测试成功了,但如果我把类的定义放到外面:
#include <stdio.h>
template <class T> class abc
{
public:
abc(T ab);
T get();
private:
T m_abc;
};
abc::abc(T ab)
{
m_abc=ab;
}
T abc::get()
{
return m_abc;
}
void main()
{
abc<int> a(123);
printf("%d\n",a.get());
}
就会错误连天,是那些地方写错了?
问题解决了,谢谢1楼的,
还有个问题:
如果类里的函数这么声明:
abc& get()
{
return *this;
}
在外部应该怎么写?
也就是返回引用。
非常感谢4楼的回答者,我是为了节省时间加上说明的准确,随便举的例子;一些小的功能我尽量用C中的函数,执行效率更快。 展开
4个回答
展开全部
一楼的说的是正确的:
template <class Type>
abc<T>::abc(T ab)
{
m_abc=ab;
}
...
但是我还是决定在说说class template的有关问题,因为你这个问题解决了,另一个问题也就来了:如果在abc.h中写:
template <class T> class abc
{
public:
abc(T ab);
T get();
private:
T m_abc;
};
那么在abc.cpp中如何定义abc中的函数呢?
是template <class T>
abc<T>::abc(T ab)
{
m_abc=ab;
}吗?
答案是否定的!(怎么跟一般的类定义不同)
C++标准委员会对于这个问题进行了一次表决(允不允许类模板(class template)中的成员函数声明在别的文件中定义,最后的结果是允许(引进了一个关键字export类处理次问题),但是标准库制定出来5年后(2003年)才有一个编译器支持这个功能!就连现在的visual studio 2008 也不支持export关键字!
但是既然有编译器支持,我就给你说一下用法:
export emplate <class T>
abc<T>::abc(T ab)
{
m_abc=ab;
}
就可以了!
可能你不觉得,你的编程习惯很不好(C与C++混用),用“标准”的写法是:
#include <iostream>
template <class T> class abc
{
public:
explicit abc(T ab):m_abc(ab){ }
T get() const
{
return m_abc;
}
private:
T m_abc;
};
int main()
{
abc<int> a(123);
std::cout << a.get() << std::endl;
return 0;
}
还有一些命名(准则)问题,如类一般用第一个字母大些的形式表示等都要注意了,这直接影响到一个程序的可读性(条理性)!
现在的形式不容乐观:C++0x可能今年年底就出来了,但是几乎100%兼容旧标准(C++98,C++03),所以改进时不断的,要加油哦~~~
补充:
abc& get()
{
return *this;
}
应写为:
template <class T>
abc<T>& abc<T>::get()
{
return *this;
}
template <class Type>
abc<T>::abc(T ab)
{
m_abc=ab;
}
...
但是我还是决定在说说class template的有关问题,因为你这个问题解决了,另一个问题也就来了:如果在abc.h中写:
template <class T> class abc
{
public:
abc(T ab);
T get();
private:
T m_abc;
};
那么在abc.cpp中如何定义abc中的函数呢?
是template <class T>
abc<T>::abc(T ab)
{
m_abc=ab;
}吗?
答案是否定的!(怎么跟一般的类定义不同)
C++标准委员会对于这个问题进行了一次表决(允不允许类模板(class template)中的成员函数声明在别的文件中定义,最后的结果是允许(引进了一个关键字export类处理次问题),但是标准库制定出来5年后(2003年)才有一个编译器支持这个功能!就连现在的visual studio 2008 也不支持export关键字!
但是既然有编译器支持,我就给你说一下用法:
export emplate <class T>
abc<T>::abc(T ab)
{
m_abc=ab;
}
就可以了!
可能你不觉得,你的编程习惯很不好(C与C++混用),用“标准”的写法是:
#include <iostream>
template <class T> class abc
{
public:
explicit abc(T ab):m_abc(ab){ }
T get() const
{
return m_abc;
}
private:
T m_abc;
};
int main()
{
abc<int> a(123);
std::cout << a.get() << std::endl;
return 0;
}
还有一些命名(准则)问题,如类一般用第一个字母大些的形式表示等都要注意了,这直接影响到一个程序的可读性(条理性)!
现在的形式不容乐观:C++0x可能今年年底就出来了,但是几乎100%兼容旧标准(C++98,C++03),所以改进时不断的,要加油哦~~~
补充:
abc& get()
{
return *this;
}
应写为:
template <class T>
abc<T>& abc<T>::get()
{
return *this;
}
展开全部
template <class T>
abc<T>::abc(T ab)
{
m_abc=ab;
}
template <class T>
T abc<T>::get()
{
return m_abc;
}
abc<T>::abc(T ab)
{
m_abc=ab;
}
template <class T>
T abc<T>::get()
{
return m_abc;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你定义的m_abc这个是private,外面是不能访问他的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
template <class T>
这个每个函数都要写
这个每个函数都要写
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询