我们什么时候需要 .template 构造
我编写了以下程序
#include <iostream>
#include <typeinfo>
template<class T>
struct Class
{
template<class U>
void display(){
std::cout<<typeid(U).name()<<std::endl;
return ;
}
};
template<class T,class U>
void func(Class<T>k)
{
k.display<U>();
}
int main()
{
Class<int> d;
func<int,double>(d);
}
上面的程序无法编译,因为 display()
是一个模板成员函数,因此在 display()
之前有 .template
的限定> 必须完成。我说得对吗?
但是当我编写以下程序时,
#include <iostream>
#include <typeinfo>
template<typename T>
class myClass
{
T dummy;
/*******/
public:
template<typename U>
void func(myClass<U> obj);
};
template<typename T>
template<typename U>
void myClass<T>::func(myClass<U> obj)
{
std::cout<<typeid(obj).name()<<std::endl;
}
template<class T,class U>
void func2(myClass<T>k)
{
k.template func<U>(k); //even it does not compile
}
int main()
{
myClass<char> d;
func2<char,int>(d);
std::cin.get();
}
为什么即使在给出 .template
构造后 k.func
也无法编译?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
<
符号表示“小于”和“开始模板参数”。为了区分这两种含义,解析器必须知道前面的标识符是否命名了模板。例如,考虑代码
T::variable
或T::constant
必须是模板。该函数意味着不同的东西,具体取决于哪个是哪个不是:T::constant
与 3 进行比较,布尔结果成为T::variable<>< /code>
T::constant<3>
与x->variable
进行比较。为了消除歧义,在
variable
或constant
之前需要使用template
关键字。情况 1:情况 2:
如果仅在实际不明确的情况下需要关键字(这种情况很少见),那就太好了,但它使解析器更容易编写,并且可以防止此类问题让您措手不及。
对于标准语言,请参阅 14.2/4:
The
<
symbol means both "less than" and "begin template arguments." To distinguish between these two meanings, the parser must know whether the preceding identifier names a template or not.For example consider the code
Either
T::variable
orT::constant
must be a template. The function means different things depending which is and which isn't:T::constant
gets compared to 3 and the Boolean result becomes a template argument toT::variable<>
T::constant<3>
gets compared tox->variable
.The to disambiguate, the
template
keyword is required before eithervariable
orconstant
. Case 1:Case 2:
It would be kind of nice if the keyword were only required in actual ambiguous situations (which are kind of rare), but it makes the parser much easier to write and it prevents such problems from catching you by surprise.
For standardese, see 14.2/4:
C++ 模板 的第 5.1 节详细解释了此构造
下面的函数有一个问题
Here T = char 和 U = int
正在被调用。然而这样的函数并不存在
即使在正常情况下“char”可以转换为“int”,但这对于显式指定的模板参数来说并不适用
Section 5.1 of C++ Templates explains this construct in detail
The below function has a problem
Here T = char and U = int
is being called. However such a function does not exist
Even though in normal circumstances 'char' is convertible to 'int', this does not hold good for explicitly specified template arguments
该标准要求 template 或
typename
关键字“nofollow noreferrer”>消除依赖于模板上下文的事物的歧义。The standard requires the
template
ortypename
keywords to disambiguate things that depend on the template context.