我有一个关于可变参数模板的问题。我有一个类以下列方式使用它们:
template <class... T>
struct A {
A(B& arg); // (1)
A(typename T::B& args...); // (2)
};
typename T::B
是某种类型,预期对于参数包中的所有实例都相等。为了便于展示,我将这种类型称为B
. 该类包含B
参数包中每个参数的实例。第二个构造函数(2)
初始化这些成员。为方便起见,有一个构造函数(1)
,它只接受一个实例并用相同的实例初始化所有成员。
构造函数的定义对我的问题并不重要,您可以将它们留空。下面提供了一个更完整的示例。
现在,问题是构造函数冲突,如果你只用一个参数初始化 A。g++-4.7
这边有点糊涂,逃了出来,但是仔细看了一下班级,问题就很明显了。
问题:
标准对这种情况有什么看法?这是应该/可以由编译器解决的歧义还是我应该避免这种情况?
避免它的最佳策略是什么?根本没有指定第一个构造函数之类的东西吗?我也可以将第一个构造函数的功能放在静态方法中,但这会使 API 更加不均匀。
感谢您的回答!
完整示例:
struct B {};
struct C
{
using B = ::B;
};
template <class... T>
struct A
{
A(B& arg) {}
A(typename T::B & ... args) {}
};
int main()
{
A<C> x(B()); // Edit: Should be: A<C> X{B()}; But not related to the problem.
return 0;
}