gpt4 book ai didi

c++ - 嵌套模板需要显式构造吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:15:22 25 4
gpt4 key购买 nike

我在父模板中有一个嵌套模板。我希望嵌套模板的实例可以转换为从同一模板(但具有不同参数)实例化的其他类。为此,我为嵌套模板创建了一个可以采用不同模板参数的构造函数:

template <class T>
struct Foo
{

template <class U>
struct Bar
{
Bar() { }

template <class X, class Y>
Bar(typename Foo<X>::template Bar<Y> b)
{

}
};

};

这应该使以下表达式能够编译:

Foo<int>::Bar<int> b = Foo<char>::Bar<char>();



但是,它不会实际编译。它给出了编译器错误:

error: conversion from ‘Foo<char>::Bar<char>’ to non-scalar type ‘Foo<int>::Bar<int>’ requested
Foo<int>::Bar<int> b = Foo<char>::Bar<char>();

所以,我很困惑。为什么这不能编译?

最佳答案

为什么第二个版本可以编译?

因为第二个不会创建 Foo<int>::Bar<int> .你遇到了 most vexing parse .

您是否尝试过使用 b这似乎有效,您会收到更多的编译器错误,显示您的 b实际上被声明为一个函数。

试试这个:

Foo<int>::Bar<int> b((Foo<char>::Bar<char>()));  // works fine? are you sure? :)
// ^ ^

你的根本问题是参数不会被推导,并且you cannot provide them explicitly因为在调用构造函数时我们不使用函数调用语法本身


为什么它们不会被推导?

为了演示,请观察以下修改后的代码,其中我将非默认构造函数替换为成员函数:

template <class T>
struct Foo
{

template <class U>
struct Bar
{
Bar();

template <class X, class Y>
void foo(typename Foo<X>::template Bar<Y> b)
{}
};
};

int main()
{
//Foo<int>::Bar<int> b = Foo<char>::Bar<char>();
Foo<int>::Bar<int> i;
i.foo(Foo<char>::Bar<char>());
}

这为我们提供了更多信息,其中 the key error is :

prog.cpp:11:14: note:   template argument deduction/substitution failed:
prog.cpp:23:30: note: couldn't deduce template parameter ‘X’
i.foo(Foo<char>::Bar<char>());

将提供显式参数的调用更改为:

i.foo<char,char>(Foo<char>::Bar<char>());

编译成功;但这对我们的原始代码没有帮助,因为我们无法为构造函数调用提供显式参数。

因此,我们陷入了推导,但不幸的是,嵌套性通过以下一系列规则为我们打破了这一点:

[C++11: 14.8.2.1/5]: These alternatives are considered only if type deduction would otherwise fail. If they yield more than one possible deduced A, the type deduction fails. [ Note: If a template-parameter is not used in any of the function parameters of a function template, or is used only in a non-deduced context, its corresponding template-argument cannot be deduced from a function call and the template-argument must be explicitly specified. —end note ]

[C++11: 14.8.2.5/5]: The non-deduced contexts are:

简而言之,我们不能指望 XFoo<X>::Bar<Y>被推导,这就是一切都崩溃的地方。所以,基本上,你不能这样做。对不起。

关于c++ - 嵌套模板需要显式构造吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19612378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com