C++ MSVC12中不允许在默认参数中实例化模板类?
我刚刚在我们的项目中提取了以下问题。下面的代码只需使用g编译即可++C++ MSVC12中不允许在默认参数中实例化模板类?,c++,templates,visual-c++,compiler-errors,default-parameters,C++,Templates,Visual C++,Compiler Errors,Default Parameters,我刚刚在我们的项目中提取了以下问题。下面的代码只需使用g编译即可++ #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;
#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;
}
<>我不想讨论C.Tor的软件设计,但是这是编译器问题还是标准C++中不允许的,G++不严格要求?p>
首先,我认为默认参数中的模板实例化可能是不允许的,或者在默认参数中嵌套了c'TOR。但是,如果我使用向量的另一个c'tor:
foo(bar* a = new bar(vec_t(0))) {}
它是用MSVC编译的。我就是不明白为什么上层版本不能编译?对此有何想法?这似乎是“最麻烦的解析”的问题(有关更多信息,请参阅相关文章)。消除新表达式歧义的一种方法是在构造函数周围添加括号,如下所示
foo(bar* a = new bar((vec_t()))) {};
当涉及到标准遵从性时,我不确定。我浏览了的第6.8节(歧义解决)和第5.3.4节(新),没有过多思考,任何东西都不突出。也许一个真正的语言律师需要介入给出答案。试试newbar((vect_t()){}
。
foo(bar* a = new bar((vec_t()))) {};