由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++中如何引用模板类中的模板函数
相关主题
template 类的继承问题[合集] 又被羞辱了一把... (转载)
模板类中的一个类型问题?请问这是什么错误呀
一个C++ template的问题g++能够生成C++ template展开之后的代码么?
请教 C++ std::list iterator 对 template class pointer 的应用问题How does template work in C++
模板对象能不能作为成员变量使用共享我的C++面试题目精选
模板识别问题C++ linking 弱问 (one file)
Any difference between class and typename identifier?问几个C++面试题吧
C++ template questionC++ template question
相关话题的讨论汇总
话题: template话题: 模板话题: typename话题: int话题: 编译器
进入Programming版参与讨论
1 (共1页)
h********n
发帖数: 1671
1
这个例子中,模板类B中引用了模板类A的模板函数f(),但是gcc无法识别这个用法。
template< typename T >
struct A
{
template< typename U >
int f (){ return 0; }
};
template< typename T >
struct B
{
A< T > a; // error
//A a; // ok
int g (){ return a.f< char >(); }
};
int main()
{
B< int > b;
return b.g();
}
U:\tmp\test.cpp: In member function 'int B::g()':
U:\tmp\test.cpp:15:31: error: expected primary-expression before 'char'
U:\tmp\test.cpp:15:31: error: expected ';' before 'char'
U:\tmp\test.cpp:15:36: error: expected unqualified-id before '>' token
在类B中,因为T为未知类型,所以a也为未知类型,所以编译器认为a.f是a的一个成员
变量,然后将'<'理解成小于号,于是要求在'<'的右侧出现一个primary-expression。
如果f是一个class,当然可以在前面加typename告诉编译器'<'表示模板参数,不是小
于号,但这个情况下typename显然行不通。那么如何告诉编译器这里'<'代表一个模板
函数的参数列表,而不是小于号呢?
如果将 A a 改成 A a 就没有这个问题,因为这时a的类型为已知,编译器就
会知道f是一个模板函数。
t****t
发帖数: 6806
2
return a.template f();

【在 h********n 的大作中提到】
: 这个例子中,模板类B中引用了模板类A的模板函数f(),但是gcc无法识别这个用法。
: template< typename T >
: struct A
: {
: template< typename U >
: int f (){ return 0; }
: };
: template< typename T >
: struct B
: {

t****t
发帖数: 6806
3
The reason is A::f is a member template. Otherwise it is ok.
[Standard 14.2]
4 When the name of a member template specialization appears after . or -> in
a postfix-expression, or after nested-name-specifier in a qualified-id, and
the postfix-expression or qualified-id explicitly depends on a template-
parameter (14.6.2), the member template name must be prefixed by the keyword
template. Otherwise the name is assumed to name a non-template. [Example:
class X {
public:
template X* alloc();
template static X* adjust();
};
template void f(T* p)
{
T* p1 = p->alloc<200>();
// ill-formed: < means less than
T* p2 = p->template alloc<200>();
// OK: < starts template argument list
T::adjust<100>();
// ill-formed: < means less than
T::template adjust<100>();
// OK: < starts template argument list
}
—end example]

【在 h********n 的大作中提到】
: 这个例子中,模板类B中引用了模板类A的模板函数f(),但是gcc无法识别这个用法。
: template< typename T >
: struct A
: {
: template< typename U >
: int f (){ return 0; }
: };
: template< typename T >
: struct B
: {

h********n
发帖数: 1671
4
受教了。以前试过加template,不过按typename的习惯加到a.f()的前面去了。
1 (共1页)
进入Programming版参与讨论
相关主题
C++ template question模板对象能不能作为成员变量使用
C++里get array size的问题 (转载)模板识别问题
C++ Q04: template memberAny difference between class and typename identifier?
一个关于C++ template和overload的问题C++ template question
template 类的继承问题[合集] 又被羞辱了一把... (转载)
模板类中的一个类型问题?请问这是什么错误呀
一个C++ template的问题g++能够生成C++ template展开之后的代码么?
请教 C++ std::list iterator 对 template class pointer 的应用问题How does template work in C++
相关话题的讨论汇总
话题: template话题: 模板话题: typename话题: int话题: 编译器