当前位置:  开发笔记 > 编程语言 > 正文

C++模板歧义

如何解决《C++模板歧义》经验,为你挑选了2个好方法。

我和朋友正在讨论C++模板.他问我应该做什么:

#include 

template 
struct A {
    A(bool) { std::cout << "bool\n"; }
    A(void*) { std::cout << "void*\n"; }
};

int main() {
    A *d = 0;
    const int b = 2;
    const int c = 1;
    new A< b > (c) > (d);
}

main中的最后一行有两个合理的解析.'b'是模板参数还是b > (c)模板参数?

虽然编译这个很简单,看看我们得到了什么,但我们想知道是什么解决了歧义?



1> Leon Timmerm..:

AFAIK它将被编译为new A(c) > d.这是解析它的唯一合理方法恕我直言.如果解析器在正常情况下无法假设>结束模板参数,那将导致更加模糊.如果你想要另一种方式,你应该写:

new A<(b > c)>(d);



2> Richard Cord..:

正如Leon&Lee所述,14.2/3(C++ '03)明确定义了这种行为.

C++'0x增加了类似规则适用的乐趣>>.基本概念是,在解析模板参数列表时,非嵌套>>将被视为两个不同的> >标记而不是右移运算符:

template 
struct A {
  A(bool);
  A(void*);
};

template 
class C
{
public:
  C (int);
};

int main() {
    A *d = 0;
    const int b = 2;
    const int c = 1;
    new C >  (c) > (d); // #1
    new C  >  (c) > (d); // #2
}

"#1"和"#2"在上面等同.

这当然解决了必须在嵌套特化中添加空格的烦恼:

C> c;  // Parse error in C++ '98, '03 due to "right shift operator"

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有