gpt4 book ai didi

c++ - 模板被推断为模板变量的错误类型

转载 作者:太空狗 更新时间:2023-10-29 21:17:34 26 4
gpt4 key购买 nike

所以我有以下测试代码:

struct empty_value{
template<typename T>
T as(){ return T(0); }
};

template<typename T, typename U, typename F>
auto empty_func(empty_value lhs, empty_value rhs, F f) -> decltype(f(lhs.as<T>(), rhs.as<U>())){
return f(lhs.as<T>(), rhs.as<U>());
}

template<typename T, typename U, template<typename, typename> class F>
static auto bind_empty_f = std::bind(empty_func<T, U, F<T, U>>, std::placeholders::_1, std::placeholders::_2, F<T, U>{});

template<typename F>
void other_test_func(F&&){}

template<typename T, typename U, template<typename, typename> class F>
void test_func(){
other_test_func(bind_empty_f<T, U, F>);
}

template<typename T, typename U>
struct my_add{
decltype(auto) operator()(T lhs, U rhs){ return lhs + rhs; }
};

int main(){
test_func<float, int, my_add>();
}

这是从我实际从事的工作中衍生出来的。问题出现在 bind_empty_f 行。但只有当它传递给 other_test_func 时。当我尝试将它分配给这样的常规变量时:

int main(){
auto var = bind_empty_f<float, int, my_add>;
}

万事如意。但是如果我调用 test_func 试图将它传递给 other_test_func 我会得到一个错误,即 std::bind 返回的基础类型不能转换为 float。所以它试图将其转换为实际函数的返回值。我不明白为什么。我在哪里传递函数的返回值?


编辑

如果我在将局部变量设置为 bind_empty_f 的值后调用该函数,它首先会编译:

int main(){
auto var = bind_empty_f<float, int, my_add>;
test_func<float, int, my_add>;
}

所以问题一定是与静态初始化有关编译器错误。

编辑2

如评论中所述,这个确切的示例可以使用其他编译器进行编译,但不能使用原始测试的编译器 (GCC 5.2.0)。

这是 GCC 5.2 或所有其他经过测试的编译器中的错误。

所以我猜问题变成了,这个符合标准的代码吗?

最佳答案

这是您的问题的一个最小示例:

template<class T> struct tag {};

template<typename T>
static auto bind_empty_f = tag<T>{};

template<typename T>
decltype(bind_empty_f<T>) test_func(){
return 3.14f;
}

然后我们简单地test_func<float>()它返回 3.14f .如果我们test_func<int>()它返回 3 .

如果我们先做一个 bind_empty_f<float> , 而不是 test_func<float>产生错误。

bind_empty_f<T> 推导的类型在另一个模板中调用时设置为 T而不是表达式右侧的类型。

如果直接调用,并且还没有计算出类型(好像有缓存),然后推导出正确的类型,我的test_func构建失败(因为它试图将 3.14f 转换为 bind 表达式类型但失败)。

这肯定是编译器的问题。您可以通过替换 auto 来解决它在bind_empty_fstd::decay_t<decltype(stuff_on_rhs)> .

请注意,您的一些绑定(bind)表达式还有其他问题,但它们不是此问题的核心。

live example compiling (wrongly) , live example not compiling (correctly) .

关于c++ - 模板被推断为模板变量的错误类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32485530/

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