M**********n 发帖数: 432 | 1 Suppose we have the following declaration:
template
class Derived: public Base::Nested {
......
For this declaration,
Is Base or Nested the class name for the base?
If base is base class name, then what is Nested?
If Nested is the base class name, what is Base? |
|
M**********n 发帖数: 432 | 2 You are saying namespace can also be templated? |
|
P********e 发帖数: 2610 | 3 我估计你程序应该是这样的
template
class Base
{
pulic: class Nested{};
};
所以Nested is base |
|
r*********r 发帖数: 3195 | 4 c++ uses type expansion. java uses type erasure. exactly opposite.
c++'s way may lead to code bloating.
but c++'s template uses integers as type parameters,
which makes the mechanism Turing complete. |
|
n**d 发帖数: 9764 | 5 My questionn is how to understand the "words" from the book. N=100 is about
the default parameter, but I don't think the "words" is talking about it. In
fact, you can not have (int N) as function template parameter.
, |
|
t****t 发帖数: 6806 | 6 MyVector::Iterator is a dependent type, so use the keyword "typename"
template
typename MyVector::Iterator MyVector::begin()
// same for end
// <<
{
typename MyVector::Iterator iter;
.... |
|
w******g 发帖数: 67 | 7 I have a question about template typedef. The question is that I want to use
the data structure like map>.
So I define the following:
#ifndef DATATEMPLATE_H_
#define DATATEMPLATE_H_
#include |
|
B********e 发帖数: 1062 | 8 template
struct MapofVec{
typedef vector VecType;
typedef typename vector::iterator VecIter;
typedef map MapType;
typedef typename map::iterator MapIter;
};
use
** |
|
B********e 发帖数: 1062 | 9 This may work.
template
class MapOfVec{
public:
typedef vector VecType;
typedef typename vector::iterator VecIter;
typedef map MapType;
typedef typename map::iterator MapIter;
void print(MapType& map);
};
agian. |
|
w******g 发帖数: 67 | 10 Yes, it works when I put both the declaration and implementation in the head
file, like:
In DataTemplate.h:
template
ElemType* getVecElemPointer(int index, vector& vec)
{
if( (index0) )
{
return &vec[index];
}
return (ElemType*) 0;
}
The linkage works. Can you explain why? Thanks. |
|
|
b***y 发帖数: 2799 | 12 ☆─────────────────────────────────────☆
qr (非凡公子) 于 (Fri Apr 11 18:03:21 2008) 提到:
我想在一个class的constructor里面初始化某些数据,希望这些数据类型可以是float
或者double的,现在的问题是如果我把constructor写在xxx.h文件中,程序不报错。但
是如果单独写在xxx.cpp中,然后include xxx.h中的declartion,在主程序中再调用这
个xxx.h然后定义该class的一个实例,编程器总是报告link错误,说这个constrctor函
数是unresolved external symbol。如果把程序改成正常的class就没有这个问题,百
思不得其解,请高手赐教。
☆─────────────────────────────────────☆
jobseek (seeking+jobs) 于 (Fri Apr 11 18:23:00 2008) 提到:
这是template的毛病,
得把declaration and definit |
|
b***y 发帖数: 2799 | 13 ☆─────────────────────────────────────☆
TonnyZB (Hallo) 于 (Sat Sep 24 16:01:42 2005) 提到:
can someone recommend a C++ book esp. on template? Thanks!
以下是附件内容: |
|
b***y 发帖数: 2799 | 14 ☆─────────────────────────────────────☆
crystalike (Vader) 于 (Mon Sep 26 16:46:54 2005) 提到:
I sort of remember that there is a occation that you have to use
this pointer to access the member func in a template class.
this->foo () ...
just can not remember exactly how and why?
anyone got the idea?
☆─────────────────────────────────────☆
pptwo (pp) 于 (Mon Sep 26 17:50:42 2005) 提到:
http://gcc.gnu.org/onlinedocs/gcc-4.0.1/gcc/Name-lookup.html#Name-lookup
☆───────────────────────────────── |
|
t****t 发帖数: 6806 | 15 因为编译器不知道到哪里去找numarray
base类是个模板, 在template parameter确定以前, 不能肯定有什么, 所以缺省是不找
base类的. 你必须显式声明numarray 是个dependent name, 才能让编译器暂时忽略这
个找不到的名字. |
|
g*****u 发帖数: 298 | 16 想打印一个STL container里的元素,但不知道是哪种container,应该怎么写?写成下
面的G++编译不通过,VC8可以。
template
void printContainer(ostream& os, const T& con)
{
T::const_iterator iter = con.begin();
while(iter != con.end())
{
os<<*iter<<" ";
iter++;
}
os<
} |
|
a*n 发帖数: 32 | 17 How about use copy?
template
void printContainer(ostream& os,const T& con)
{
ostream_iterator out(os," ");
copy(con.begin(), con.end(),out);
} |
|
X****r 发帖数: 3557 | 18 是我用词不当,instantiation这个词在C++里专用的,我指的是创建对象。
只有类(class)才能用来创建对象,类模板(class template)不能。 |
|
y****i 发帖数: 23 | 19 假设要写一个通用类型的binary search tree
class的定义大致是这样子的
template
class BST{
private:
T key;
T * left;
T * right;
public:
insert...
delete...
}
问题是,在写插入算法的时候牵涉到数据的比较,但是T啥类型我们又不知道,有可能
int,也有可能是struct,怎么比较两个T类型的变量呢? |
|
t****t 发帖数: 6806 | 20 参考STL的做法.
STL的做法是在模板参数里提供一个compare类型, 有缺省值, 比如map
template , ...>
class map { ... };
less::operator()(T, T)对于大多数类型, 就是operator<.
对于struct S, 你可以提供
bool operator<(const S&, const S&)
或者你不想要<, 你想要>, 可以写map > |
|
y****i 发帖数: 23 | 21 我明白你的意思啦,多谢。
从你的建议的提示,我想到可以这么做
template
class BST{
.....
}
在T的定义里面overload <,>,=这些需要用到的operator
这样在class BST里面就可以直接比较两个T类型的变量 |
|
z****e 发帖数: 2024 | 22 template
void apply(Seq& sq, R(T::*f)(A) const, A a) {
typename Seq::iterator it = sq.begin();
while(it != sq.end())
((*it++)->*f)(a);
}
请问
1. how does the compiler understand T::*f? a member function of T, which
returns R and take A? what does "f" represent?
2. if i change T::*f to be T::*g, all other code remain the same, is this
still alright? |
|
s*****g 发帖数: 5159 | 23 I am a beginner of C++ template, in the follow piece of code: |
|
s*****g 发帖数: 5159 | 24 I tried and this this does now work.
vector *p must have template defined at declaration.
I am also thinking of using typedef, but I do not know if there is a type fo
r variables's type, like |
|
|
X****r 发帖数: 3557 | 26 Before defining class Job, forward-declare class Scheduler:
template class Scheduler; |
|
z****e 发帖数: 2024 | 27 template std::ostream& operator<< (std::ostream& , const
Rational& );
把operator<<后边的去掉。
你加上,是一个specialization的形式, 但是无从specialize 起,本身就错误的语法。
另外,你根本不需要friend呀,都是通过公有interface干的事情。
如果class里边没有,是一个普通函数,你没定义过,编译器找不到。
或者你根本用不着模板,就直接把friend定义class里边,也不用,也不用forward delcare,这样,每次,class模板生成一次,都新生成一个overload friend,的普通函数。
明白否? |
|
z****e 发帖数: 2024 | 28 如果你是编译器,看到forward 已经就是一个模板了,紧接着后面又看到一个,作
何感想?
template std::ostream& operator<<, 明明白白说了是个模板,后面再
加一个是画蛇添足吗?但是善良的编译器,会最大耐心的去理解你,会认为你是最
有聪明才智的人,不会犯这种错误,肯定是你有特殊的目的,才会告诉编译器,这不仅
仅是个模板,而且要用类型T,这个特殊的目的就是specialization。
但是,编译器猛然发现,你根本没有定义普通形式的模板,而且这个类型也不存在
,啊!原来你刷我,我就和死磕。 |
|
y***a 发帖数: 840 | 29 is this related with something called generative template?
I wish I attended the programming language courses when I was in school.
static
templa
mu |
|
t****t 发帖数: 6806 | 30 template
A foo(const A&, const A&);
isn't it straightforward?
T |
|
c***d 发帖数: 996 | 31 in c++:
Orange.h:
#include "fruit.h"
class Orange : public fruit {
}
Apple.h:
#include "fruit.h"
class Apple : public fruit {
}
fruit.h:
class fruit {
static string brand;
}
string fruit:brand = "dole";
if I compile this I will get multiple definition error at linking phrase. I
can not move the static variable definition to a cpp file since it is a
template file which i can not change. What would be a sensible way to work
around this? |
|
r****t 发帖数: 10904 | 32 可能没有 fruit.o 给你 link,他这个是 template header |
|
z****e 发帖数: 2024 | 33 我就是不行啊,没经验,没工作,一穷二白。
基本的也不清楚了。
template不也重复定义了吗?如果在很多cpp里边include的话,难道不算重复定义? |
|
X****r 发帖数: 3557 | 34 好,那我问你,先不说template,就是一个普通的class,它在头文件里定义的,
被很多cpp包含,算不算重复定义? |
|
X****r 发帖数: 3557 | 35 从C++语言的角度讲,one definition rule有两个主要方面:
一是在同一个translation unit里面,几乎所有东西都最多只能定义一次。
二是在同一个程序里,几乎所有被用到的对象和非inline的函数必须定义恰好一次。
两条都有一些例外,比如就class template来说,它的静态数据成员可以不符合二。 |
|
z****e 发帖数: 2024 | 36 see: template specialization. |
|
t****t 发帖数: 6806 | 37 that's not the correct chapter to refer to. check [14.3.2 Template non-type
arguments]. |
|
c**********e 发帖数: 2007 | 38 #include
using namespace std;
void f() { cout << "::f" << endl; }
struct P {
void f() { cout << "P::f" << endl; }
};
template
struct X : public T {
void g1() { f(); }
};
int main()
{
X x;
x.g1();
return 0;
}
Choices
a. ::f
b. P::f
c. The program exhibits undefined behavior. |
|
a****d 发帖数: 114 | 39 第一个版本里面的template也有const啊。。。
为了不混淆我小改了一下。
value, compiler 用 0 所以能 const int
的了。高人能不能从 standard 里面找 |
|
j***i 发帖数: 1278 | 40 我想的是,template instantiation 也是visable 的overload resolution candidate
set,when T is binded to int* , is matched |
|
j***i 发帖数: 1278 | 41 another question, if const is just delete,
in first function both templalte and plain function becomes int*, they
we should prefer plain function instead of template
I am comfusing now, master
candidate |
|
p********7 发帖数: 549 | 42 这个也算基本问题? template我经常用,没看到这么用的啊
我猜的是C,不知道是不是 |
|
w********i 发帖数: 244 | 43 Deal All,
Project Management Source Codes | Template bassed on .net. Please recommend
one!!!
Thank you very much!!! |
|
d****p 发帖数: 685 | 44 Yes. function template could not be partially specialized |
|
r*******m 发帖数: 109 | 45 template
typename Container::value_type
Reduce(const Container& c, Function fn)
{
if (c.size()<1) throw NotEnoughElement();
typename Container::value_type T(0);
for (typename Container::const_iterator it=c.begin();it!=c.end();++it)
T=fn(T,*it);
return T;
} |
|
b**a 发帖数: 1375 | 46 下面这个function在visual studio 2010下没问题
template
typename T::value_type reduce(const T& t, Fn f)
{
T::value_type result = *t.begin();
T::const_iterator it=t.begin();
for (++it; it!=t.end(); ++it)
result = f(result, *it);
return result;
}
调用的话比如:
vectorv;
v.push_back(1); v.push_back(2); v.push_back(3);
cout << reduce(v, plus())<
但是在linux的gcc(4.1 -> 4.6)下出现好几个类似
error: need ‘typename’ before ‘T:: value_type’ becau... 阅读全帖 |
|
b******n 发帖数: 592 | 47 0 vector a;
1 C<0>(a); // container
I tried to implement C as
template
class C{
const T & mT;
public:
C(const T& t) : mT(t) {};
}
Compiler always complains about T is missing in 1. Is there any way to get
around this? |
|
e****d 发帖数: 895 | 48 Use a template function to generate C<>. |
|
s*w 发帖数: 729 | 49 你的 vector 没类型啊? 貌似你想做的是 template specification. N 也没用上啊,
去了得了 |
|
h********n 发帖数: 1671 | 50 试了一下,在gcc中直接写进一个常数时会报错
template class Bar{};
但是用T代替1时就不会报错,虽然编译器此时应知道T是一个整数。
这可能是compiler的一个bug,在进行模板参数检查时漏掉了一个case,没能认出T的类
型。模板声明时只进行最基本的检查,可能会漏掉一些错误。如果没有真正用到,这些
错误不会造成任何问题。如果真正用到了,那时更详细的检查就会发现错误。 |
|