gpt4 book ai didi

c++ - 模板区域中的不可推导上下文

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:18 25 4
gpt4 key购买 nike

template<typename T>
struct Wrap {
Wrap(T *p) {}
};

#ifdef TEMPLATE
template<typename T>
void foo (Wrap<T> t) {} // version-1

#else
void foo (Wrap<int> p) {} // version-2
#endif

int main () {
foo(new int);
}

编译#else 部分时,编译正常并选择了version-2。如果我尝试编译 #ifdef 部分,我希望应该选择版本 1。但是编译器给出错误,

error: no matching function for call to `foo(int*)'

我是否触及了 template foo 的不可推导部分?如果是,那么谁能阐明不可推导区域的确切规则是什么?

最佳答案

类模板的类型无法根据传递给其构造函数的参数来确定。要知道哪些构造函数可用,编译器必须已经选择了哪些 Wrap实例化。

#else您已明确选择实例化的 block Wrap<int> , 所以编译器知道使用隐式 Wrap<int>(int*)构造函数。


也许通俗地说:一个类型是不可推导的,如果推导它的前提是知道要推导的类型是什么。

关于c++ - 模板区域中的不可推导上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8397709/

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