gpt4 book ai didi

c++ - 如何在返回类型函数模板的特化中使用派生类型? ("couldn' t 推断模板参数")

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

我有一个模板类和一个具有模板返回类型的函数:

template<typename T>
class Wrapper {
public:
Wrapper(const T& _data) : data(_data) { }

const T& get_data() {return data;};
private:
T data;
};

template <typename T>
Wrapper<T> build_wrapped(){
T t{};
return Wrapper<T>(t);
}

假设我想为一个特定类型 T 扩展返回的 Wrapper 并为该类型专门化 build_wrapped() 函数。因此,让我们创建一个模板来保存返回类型并在 build_wrapped() 中使用它:

template<typename T>
struct ReturnType {
using type = Wrapper<T>;
};

template <typename T>
typename ReturnType<T>::type build_wrapped(){
T t{};
return typename ReturnType<T>::type(t);
}

并用它来提供特化:

struct Foo{};

class ExtendedWrapper : public Wrapper<Foo> {
public:
ExtendedWrapper(const Foo& _data) : Wrapper(_data) {}
int get_answer() {return 42;};
};

template<>
struct ReturnType<Foo> {
using type = ExtendedWrapper;
};

template<>
typename ReturnType<Foo>::type build_wrapped(){
Foo t{};
return typename ReturnType<Foo>::type(t);
}

然而,最后的声明被gcc和clang都拒绝了。例如,clang返回:

error: no function template matches function template specialization 'build_wrapped'

note: candidate template ignored: couldn't infer template argument 'T'

我可以通过为 Foo 创建 Wrapper 的显式特化来避免使用 ReturnType。但是,这需要复制 Wrapper 中的所有代码(在我的现实生活中,它是一个实质性的类),而我只想添加一些新功能(如 ExtendedWrapper) .那么,这可以做到吗?上面的方法有什么问题?

最佳答案

编译器已经告诉你问题出在哪里:

note: candidate template ignored: couldn't infer template argument 'T'

您需要明确指定模板参数。

template <>
typename ReturnType<Foo>::type build_wrapped<Foo>()
{ // ^~~~~
Foo t{};
return typename ReturnType<Foo>::type(t);
}

关于c++ - 如何在返回类型函数模板的特化中使用派生类型? ("couldn' t 推断模板参数"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54010630/

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