首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSVC12中不允许默认参数中的模板类实例化?

MSVC12中不允许默认参数中的模板类实例化?
EN

Stack Overflow用户
提问于 2013-11-14 08:36:43
回答 1查看 136关注 0票数 0

我刚刚在我们的项目中提取了以下问题。下面的代码在g++中编译得很好

代码语言:javascript
复制
#include <vector>

class A {};

typedef std::vector<A*> vec_t;

class bar {
public:
  bar(vec_t) {};
};

class foo
{
public:
  foo(bar* a = new bar(vec_t())) {};
};

class B
{};

int main()
{
  return 0;
}

但是,(VC12,但我想所有其他编译器也是如此)不明白在foo的c‘too的默认参数中调用bar的c’too,它以向量的实例作为参数。这将导致在此表达式之后声明的每个类/结构出现错误:

代码语言:javascript
复制
error C2462: 'B' : cannot define a type in a 'new-expression'

我不想讨论C‘to的软件设计,但是这是一个编译器问题还是在标准C++和g++中是不允许的,只是对此不严格而已?

首先,我认为默认参数中的模板实例化可能不允许,也可能不允许在默认参数中嵌套c‘’tors。但是,如果我使用向量的另一个c‘’tor:

代码语言:javascript
复制
foo(bar* a = new bar(vec_t(0))) {}

它用MSVC编译。我只是不明白为什么上面的版本不应该编译?对此有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2013-11-15 00:43:27

看起来这是“最烦人的解析”的一个问题(更多信息请参见维基百科文章)。消除新表达式歧义的一种方法是在构造函数周围添加括号,如下所示

代码语言:javascript
复制
foo(bar* a = new bar((vec_t()))) {};

当涉及到标准遵从性时,我不确定。我略读了N3690的第6.8节(歧义解决方案)和5.3.4 (新的)部分,没有想太多,也没有什么特别之处。也许一个真正的语言律师需要介入才能给出答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19972966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档