模板的模板参数语法错误

qunqun2012 2011-11-10 08:51:33
以下是一个 纯语法的例子,类是空的,什么都没有做




#include<iostream>
using namespace std;

template<typename type, typename container>
class Test
{
private:
type data1;
container data2;

};



template<typename T, template<typename type,typename container> class Test >
class A
{
Test<T,container> obj; //这里报错,按理说,怎么会报错啊?
};

int main()
{
return 0;
}



Test<type,container>也应该对?

Test<T,container>也应该对啊?
...全文
676 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
dengqibin 2011-11-11
  • 打赏
  • 举报
回复
在这神棍节又长见识了,模板的模板参数
冻结 2011-11-10
  • 打赏
  • 举报
回复
《C++ 模板》适合神棍节看。。。
xmu_才盛 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 pengzhixi 的回复:]
模板的模板参数是要由前面的普通的模板参数来实例化的。
[/Quote]

这句话真精辟,
编译器不是人, 它有自己的认知规则, 编译型的编译器就必须定义后才能使用, 而且还有作用域的情况
xmu_才盛 2011-11-10
  • 打赏
  • 举报
回复
container 模板没有声明, 所以A无法使用。
模板的生命周期只在该类中, 同一个文件的其他类就不认识了。
同理, 函数模板的生命周期只在该函数中, 同一文件的其它函数也不认识

template<typename type, typename container>
class Test
{
private:
type m_typeData;
container m_containerData;
};

template<typename T, typename container, template<typename type,

typename container> class Test>
class A
{
Test<T, container> m_obj;
};
xingfeng2510 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 demon__hunter 的回复:]

C/C++ code

template<typename T,
template<typename ELEM, typename ALLOC=std::allocator<ELEM>>classCONT=deque>
class Test
{
ELEM e;//不可见
};
[/Quote]
楼上正解
pengzhixi 2011-11-10
  • 打赏
  • 举报
回复
模板的模板参数是要由前面的普通的模板参数来实例化的。
机智的呆呆 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 qunqun2012 的回复:]
ELEM ,ALLOC 都不可见,


只能靠CONT<T>这样使用?


是这个意思吧


引用 13 楼 demon__hunter 的回复:
C/C++ code

template<typename T,
template<typename ELEM, typename ALLOC=std::allocator<ELEM>>classCONT=deque>
cl……
[/Quote]
俺的个人理解,模板的模板参数的参数ELEM,只能被模板的模板参数的其他参数使用比如这里的模板的模板参数的参数ALLOC,而在模板类 Test中不可见的。
机智的呆呆 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qunqun2012 的回复:]
纠正个歌概念:


ELEM 叫:模板的模板参数的 模板参数

page.47


CONT 叫模板的模板参数

T叫模板的参数



引用 12 楼 demon__hunter 的回复:
引用 8 楼 demon__hunter 的回复:
模板的模板参数,它的参数名称只能被自身其他参数的声明使用,所以通常模板的模板参数的名称经常不写。

这句话,也是c++te……
[/Quote]
en,确实俺概念弄错了。多谢指正.
qunqun2012 2011-11-10
  • 打赏
  • 举报
回复
ELEM ,ALLOC 都不可见,


只能靠CONT<T>这样使用?


是这个意思吧

[Quote=引用 13 楼 demon__hunter 的回复:]
C/C++ code

template<typename T,
template<typename ELEM, typename ALLOC=std::allocator<ELEM>>classCONT=deque>
class Test
{
ELEM e;//不可见
};
[/Quote]
qunqun2012 2011-11-10
  • 打赏
  • 举报
回复
纠正个歌概念:


ELEM 叫:模板的模板参数的 模板参数

page.47


CONT 叫模板的模板参数

T叫模板的参数


[Quote=引用 12 楼 demon__hunter 的回复:]
引用 8 楼 demon__hunter 的回复:
模板的模板参数,它的参数名称只能被自身其他参数的声明使用,所以通常模板的模板参数的名称经常不写。

这句话,也是c++template上的.
template<typename T,template<typename ELEM, typename ALLOC=std::allocator<ELEM> >
class CONT=std::……
[/Quote]
机智的呆呆 2011-11-10
  • 打赏
  • 举报
回复

template<typename T,
template<typename ELEM, typename ALLOC=std::allocator<ELEM>>classCONT=deque>
class Test
{
ELEM e;//不可见
};

机智的呆呆 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 demon__hunter 的回复:]
模板的模板参数,它的参数名称只能被自身其他参数的声明使用,所以通常模板的模板参数的名称经常不写。
[/Quote]
这句话,也是c++template上的.
template<typename T,template<typename ELEM, typename ALLOC=std::allocator<ELEM> >
class CONT=std::deque>
{
ELEM e;
}
就以上面的例子来说,模板的模板参数ELEM,可以用allocator<ELEM>中声明使用,但不能在ELEM e;处使用
we_sky2008 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 caddor 的回复:]
c++ templates一书的一个例子:


template<typename T,template<typename ELEM, typename ALLOC=std::allocator<ELEM> >
class CONT=std::deque>


做个比较:

template<typename T, template<typename type,typename ……
[/Quote]
恩,以前还真没见过模板的模板参数
学习了
caddor 2011-11-10
  • 打赏
  • 举报
回复
哪个是外?



[Quote=引用 7 楼 qq120848369 的回复:]
g++ -o main -g main.cpp
main.cpp:18:9: error: ‘container’ was not declared in this scope
main.cpp:18:18: error: template argument 2 is invalid

第二个模板参数的模板列表对外是不可见的。

C/C++ code
#include<iostrea……
[/Quote]
caddor 2011-11-10
  • 打赏
  • 举报
回复
c++ templates一书的一个例子:


template<typename T,template<typename ELEM, typename ALLOC=std::allocator<ELEM> >
class CONT=std::deque>


做个比较:

template<typename T, template<typename type,typename container> class Test >
clas A

只不过 c++ templates一书上用了默认参数






[Quote=引用 6 楼 we_sky2008 的回复:]
C/C++ code

template<typename T, template<typename type,typename container> class Test >


没有这种语法的,按照你理解的,当你实例化A实例时应该怎么指定第二个模板参数呢?
[/Quote]
机智的呆呆 2011-11-10
  • 打赏
  • 举报
回复
模板的模板参数,它的参数名称只能被自身其他参数的声明使用,所以通常模板的模板参数的名称经常不写。
qq120848369 2011-11-10
  • 打赏
  • 举报
回复
g++ -o main -g main.cpp
main.cpp:18:9: error: ‘container’ was not declared in this scope
main.cpp:18:18: error: template argument 2 is invalid

第二个模板参数的模板列表对外是不可见的。
#include<iostream>
using namespace std;

template<typename type, typename container>
class Test
{
private:
type data1;
container data2;

};



template<typename T, template<typename type,typename container> class Test >
class A
{
Test<T,int> obj; //这里报错,按理说,怎么会报错啊?
};

int main()
{
A<int,Test> a;

return 0;
}


这样就过了。
we_sky2008 2011-11-10
  • 打赏
  • 举报
回复

template<typename T, template<typename type,typename container> class Test >

没有这种语法的,按照你理解的,当你实例化A实例时应该怎么指定第二个模板参数呢?
qunqun2012 2011-11-10
  • 打赏
  • 举报
回复
没有听懂

我是这么理解的:

T----------A的模板参数

Test----------A的模板的参数(也叫:模板的模板参数), 完整书写为:template<typename type,typename container>class Test是一个类末班

Test的类型是什么? Test<type,container>对吧?

那么如果把Test当做类末班A的 成员对象,那么可以是:

Test<参数1,参数2>obj;

可是报错了。。。。

我猜测你的意思是说,由于:Test本身是一个类模板,所以不能够写成:Test<参数1,参数2》obj的形式?


可是我见过类似的例子啊,只不过 Test是一个默认参数






按照你说的, 如果一个类模板成为一个模板的模板参数,那么

[Quote=引用 4 楼 we_sky2008 的回复:]
引用 3 楼 qunqun2012 的回复:
为什么错误啊?、


把第一个类末班当做 第二个模板的 模板参数


没有错啊??


模板的模板参数的概念 就是这个啊




引用 2 楼 we_sky2008 的回复:
是不是应该这样:


C/C++ code

template<typename type, typename container>
……
[/Quote]
we_sky2008 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qunqun2012 的回复:]
为什么错误啊?、


把第一个类末班当做 第二个模板的 模板参数


没有错啊??


模板的模板参数的概念 就是这个啊




引用 2 楼 we_sky2008 的回复:
是不是应该这样:


C/C++ code

template<typename type, typename container>
class Test
{
private:
……
[/Quote]
直接在A中使用Test就行了,模板参数必须是一个特定类型,不能是一个泛型的模板参数
加载更多回复(3)

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧