如何在新表达式中指定构造函数的模板参数?
How to specify constructor's template arguments inside a new expression?
我在另一段代码中遇到了这个问题,但它归结为这个片段:
#include <iostream>
struct A
{
template <int I>
A() : _i{I} {}
int _i;
};
int main()
{
A* ptr = new A; // how to call the constructor with a specific template argument ?
return 0;
}
这不会令人惊讶地引发以下错误:
clang++ -std=c++17 -Wall main.cpp && ./a.out;
main.cpp:13:18: error: no matching constructor for initialization of 'A'
A* ptr = new A; // how to call the constructor with a specific template argument ?
^
main.cpp:6:5: note: candidate template ignored: couldn't infer template argument 'I'
A() : _i{I} {}
^
main.cpp:3:8: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 0 were provided
struct A
^
这看起来像是一个以前会遇到一千次的问题,但我在 cppreference 或 SO 上找不到解决方案。
如何在新表达式中指定构造函数的模板参数?
不幸的是,您不能为构造函数模板显式指定模板参数,除非可以推导模板参数,否则不能使用它。 [temp.arg.explicit]/8
[ Note: Because the explicit template argument list follows the function template name, and because constructor templates ([class.ctor]) are named without using a function name ([class.qual]), there is no way to provide an explicit template argument list for these function templates. — end note ]
如我的评论所述,可能的解决方法是使用继承:
struct A
{
int _i;
};
template<int I>
struct B : A
{
B() : A::_i(I) {}
};
...
A* a = new B<10>;
你必须推导它。您不能显式传递它们。
您的示例的一个解决方案是:
struct A
{
template <int I>
A(std::integral_constant<int, I>) : _i{I} {}
int _i;
};
auto a = A{std::integral_constant<int, 4>{}};
我在另一段代码中遇到了这个问题,但它归结为这个片段:
#include <iostream>
struct A
{
template <int I>
A() : _i{I} {}
int _i;
};
int main()
{
A* ptr = new A; // how to call the constructor with a specific template argument ?
return 0;
}
这不会令人惊讶地引发以下错误:
clang++ -std=c++17 -Wall main.cpp && ./a.out;
main.cpp:13:18: error: no matching constructor for initialization of 'A'
A* ptr = new A; // how to call the constructor with a specific template argument ?
^
main.cpp:6:5: note: candidate template ignored: couldn't infer template argument 'I'
A() : _i{I} {}
^
main.cpp:3:8: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 0 were provided
struct A
^
这看起来像是一个以前会遇到一千次的问题,但我在 cppreference 或 SO 上找不到解决方案。
如何在新表达式中指定构造函数的模板参数?
不幸的是,您不能为构造函数模板显式指定模板参数,除非可以推导模板参数,否则不能使用它。 [temp.arg.explicit]/8
[ Note: Because the explicit template argument list follows the function template name, and because constructor templates ([class.ctor]) are named without using a function name ([class.qual]), there is no way to provide an explicit template argument list for these function templates. — end note ]
如我的评论所述,可能的解决方法是使用继承:
struct A
{
int _i;
};
template<int I>
struct B : A
{
B() : A::_i(I) {}
};
...
A* a = new B<10>;
你必须推导它。您不能显式传递它们。
您的示例的一个解决方案是:
struct A
{
template <int I>
A(std::integral_constant<int, I>) : _i{I} {}
int _i;
};
auto a = A{std::integral_constant<int, 4>{}};