错误:模板成员函数的外线定义与 Foo 中的任何声明都不匹配

问题描述 投票:0回答:1

我正在尝试实现一个具有可以处理不同类型的静态成员函数的类模板。我的代码如下所示(非常简单的示例):

#include <array>

struct Foo {
    template<typename T>
    static constexpr size_t foo(T v);
};

template<>
constexpr size_t Foo::foo(double v) {
    return sizeof(v);
}

template<int count>
constexpr size_t Foo::foo(const std::array<int, count>& v) {
    return sizeof(int) * v.size();
}

但是,当我尝试编译它时,出现以下错误:

<source>:16:23: error: out-of-line definition of 'foo' does not match any declaration in 'Foo'
   16 | constexpr size_t Foo::foo(const std::array<int, count>& v) {
      |                       ^~~
1 error generated.
Compiler returned: 1

如何使用另一个模板来专门化一个模板?

c++ c++14
1个回答
0
投票

foo
Foo
中声明为带有类型参数 (
typename T
) 的模板。

您首先使用

double
参数进行专业化是该模板的有效专业化。

但是您的第二个无效,因为您无法使用非类型参数一 (

typename T
) 专门化具有类型参数 (
int count
) 的模板。

相反,您可以简单地向

Foo
添加另一个使用非类型参数的函数模板:

#include <array>

struct Foo {
    template<typename T>
    static constexpr size_t foo(T v);

    template<int count>
    constexpr size_t foo(const std::array<int, count>& v) {
        return sizeof(int) * v.size();
    }
};

template<>
constexpr size_t Foo::foo(double v) {
    return sizeof(v);
}
© www.soinside.com 2019 - 2024. All rights reserved.