当前位置: 首页 > 知识库问答 >
问题:

C 20中模板的参数相关查找

勾岳
2023-03-14

以下程序在C 20中编译良好:

#include <memory>

struct A{ virtual ~A() = default; };
struct B: A {};

int main()
{
    std::shared_ptr<A> p = std::make_shared<B>();
    auto x = dynamic_pointer_cast<A>(p);
}

但在C 17中,它会产生一个错误:

<source>: In function 'int main()':
<source>:9:14: error: 'dynamic_pointer_cast' was not declared in this scope; did you mean 'std::dynamic_pointer_cast'?
    9 |     auto x = dynamic_pointer_cast<A>(p);
      |              ^~~~~~~~~~~~~~~~~~~~
      |              std::dynamic_pointer_cast
In file included from /opt/compiler-explorer/gcc-11.1.0/include/c++++/11.1.0/memory:77,
                 from <source>:1:

你能告诉我C20有什么变化让它工作吗?

共有1个答案

索卓
2023-03-14

https://en.cppreference.com/w/cpp/language/adl

虽然即使普通查找什么也找不到,函数调用也可以通过ADL解析,但对具有显式指定模板参数的函数模板的函数调用需要有普通查找找到的模板的声明(否则,遇到未知名称后跟小于字符是语法错误)(直到C 20)

 类似资料:
  • 这是关于cppreference的描述。com说 模板中使用的依赖名称的查找将推迟到模板参数已知时,此时[…]ADL检查从模板定义上下文或模板实例化上下文可见的具有外部链接的函数声明。 与此相反,以下代码段可以使用三个编译器(MSVC、clang、gcc)很好地编译: Foo是CallFoo中的从属名称:它取决于模板参数T。但是,尽管违反了上述两条规则,编译器还是找到了函数Foo。 从的定义或实例

  • 假设我有这样的东西: 每种类型在编译时都是已知的。因此,对于添加到映射中的每个类型配置,都会创建一个新的映射。 是否有一种方法可以在所有匹配T参数的映射实例中仅搜索关键字(和关键字类型)? 编辑:对不起,我的问题太简单了。我害怕把它做得太大,最后它错过了我的意图。但我想,正如@Quimby所解释的那样,我试图实现的目标是不可能实现的。 我真正想做的是一个debug助手(实际上是虚幻的),来跟踪对象

  • 本问题参考有效C书第44项。Scott Mayers指出,下面的模板类可能会导致代码膨胀,因为invert函数不一定依赖于模板参数n 他建议反转函数可以在基类中分解如下。请注意,易失变量仅用于测试目的,以防止编译器优化所有内容。SquareMatrixBase::invert不应该做任何合理的事情。我只是想检查它的代码是否重复。 在这一点上,斯科特·梅耶斯说: 现在,许多(也许是所有)Square

  • 我有这样的情况 这是我自己的Vector类,构造函数模拟了Vector的行为(u可以通过使用interator提供的数据范围来构造它),但增加了一个要求,即容器是与正在构造的容器相同类型的模板。我有错误 5.cpp:16:36:错误:调用“Vector::Vector(Vector::Iterator,Vector::Iterator)”没有匹配函数5.cpp:16:36:注意:候选项是:包含在5

  • 我有以下问题:一个类模板a,有几个模板参数,我想构建一个类B,它以a为模板参数,并提取a的第一个模板参数,以便在某种方法中使用它(想想从std::vector 中提取int并返回默认的int{})。 我知道这种天真的方法不会编译,但我不知道如何实现这样的东西。感谢任何提示。

  • 请找到我使用过的代码。以下HQL查询失败,说明: 找不到命名参数 [模板 Id] 但是模板 Id 存在于我的模型类中。 请帮助解决问题或可能导致此类错误的原因: 模型文件 请帮助解决我的问题