明确的专业化" ..."不是函数模板的特化

时间:2018-01-28 17:08:06

标签: c++ templates template-specialization

我试图专门设计一个功能模板,但我收到错误(标题)并且我不知道如何解决它。我猜这是由于我在模板专业化中使用的混合类型。这个想法只是在专业化中使用int作为double。非常感谢。

template <typename T>
T test(T x) { return x*x; }

template <>
double test<int>(int x) { return test<double>(x); }

2 个答案:

答案 0 :(得分:8)

  

显式特化“...”不是功能模板的专业化

真。 因为您定义了template <typename T> T test(T x) { return x*x; }

T

接收T类型并返回相同的 template <> double test<int>(int x) { return test<double>(x); } 类型。

定义时

int

您正在定义一个接收double值并返回其他类型(T test(T))的专精。

因此与double test(int x) { return test<double>(x); } 不匹配。

您可以通过重载来解决问题

foreach($div as $divi => $value) {
                echo $value['stats']['dividendRate']; 
                }

答案 1 :(得分:5)

正如您所说,您使用的是返回类型T = double,但用于参数T = int,这不是有效的。

您可以做的是提供非模板化的过载:

template<typename T>
T test(T x) { return x*x; }

// regular overload, gets chosen when you call test(10)
double test(int x) { return test<double>(x); }

当然,有人可以随时致电test<int>(/*...*/);。如果这是不可接受的,只需删除专业化:

template<>
int test(int) = delete;