gpt4 book ai didi

c++ - 模板化使用无法选择模板函数以用作 Visual Studio 中的参数

转载 作者:行者123 更新时间:2023-11-28 04:22:46 24 4
gpt4 key购买 nike

这已经尽可能简化了,但仍然存在错误:

struct Vector3f64 {
double x;
double y;
double z;
};

struct Vector3f32 {
float x;
float y;
float z;
};

// I use this to select their element type in functions:
template <typename T>
using param_vector = std::conditional_t<std::is_same_v<std::remove_const_t<std::remove_reference_t<T>>, Vector3f64>, double, float>;

// This is the function I want to pull the return type from:
template <typename T>
T VectorVolume(const T x, const T y, const T z) {
return x * x + y * y + z * z;
}

template<class R, class... ARGS>
std::function<R(ARGS...)> make_func(R(*ptr)(ARGS...)) {
return std::function<R(ARGS...)>(ptr);
}

// This function fails to compile:
template <typename T>
typename decltype(make_func(&VectorVolume<param_vector<T>>))::result_type func(const T& dir) {
return VectorVolume(dir.x, dir.y, dir.z);
}

int main() {
const Vector3f64 foo{ 10.0, 10.0, 10.0 };

std::cout << func(foo) << std::endl;
}

make_func 来自 SergyA's answer我想创建一个 std::function,这样我就可以找到一个返回类型,而无需显式声明 VectorVolume 采用的参数。但是我从 得到这个错误版本 15.6.7:

error C2039: result_type: is not a member of 'global namespace' error C2061: syntax error: identifier func error C2143: syntax error: missing ; before { error C2447: {: missing function header (old-style formal list?) error C3861: func: identifier not found

这在 上运行良好在 g++ 中:https://ideone.com/PU3oBV它甚至可以在 上正常工作如果我不将 using 语句作为模板参数传递:

template <typename T>
typename decltype(make_func(&VectorVolume<double>))::result_type func(const T& dir) {
return VectorVolume(dir.x, dir.y, dir.z);
}

这与我在这里解决的问题几乎相同:Templated usings Can't be Nested in Visual Studio不幸的是,在那种情况下,我只能用 result_of 调用替换我的函数构造。在这种情况下,我只是看不出如何重新设计 make_func 来解决这个错误。有谁知道解决方法? (除了升级到 15.9.5,这确实解决了这个问题。)

最佳答案

作为解决方法,您可以简单地执行以下操作:

template <typename T>
auto func(const T& dir)
-> decltype(VectorVolume(dir.x, dir.y, dir.z))
{
return VectorVolume(dir.x, dir.y, dir.z);
}

关于c++ - 模板化使用无法选择模板函数以用作 Visual Studio 中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55047417/

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