首页 > 解决方案 > 显式实例化:为什么不起作用

问题描述

这是一个示例code

在我的标题中:

class SomeClass:
{
template <int N, typename ExtractedType>
            bool ExtractDataFromArray(std::array<uint8_t, N> &ExtractFrom,
                                      uint8_t StartBit, uint8_t BitLen, ExtractedType &out);
}

在我的 cpp 中:

template <int N, typename ExtractedType>
bool SomeClass::ExtractDataFromArray(std::array<uint8_t, N> &ExtractFrom,
                                               uint8_t StartBit, uint8_t BitLen, ExtractedType &out) {
...<implementation for all>        }

// instantiation for used later:
        template bool SomeClass::ExtractDataFromArray<8, int>
            (std::array<uint8_t, 8>, uint8_t, uint8_t, int &);

为什么它拒绝ExtractDataFromArray为 pair实例化<8, int>

Error是 :

template-id ‘ExtractDataFromArray<8, int>’ for ‘bool SomeClass::ExtractDataFromArray(std::array<unsigned char, 8ul>, uint8_t, uint8_t, int&)’ does not match any template declaration
         template bool SomeClass::ExtractDataFromArray<8, int>
                       ^

标签: c++11instantiation

解决方案


尽管样本已更改了多种类型,但原始答案仍然解决了其中一个问题 - 更改templatetemplate<>您的完整专业线。还总是提到编译器 - 以某种方式跳过<>实际上是用 Visual Studio 2017 编译的,而 gcc 抱怨。

此外,正如@Irm29 在您现在更改的示例中所发现的那样,您的签名错误,您缺少第一个参数的参考。应该是std::array<uint8_t, 8>&

#include <iostream>
#include <array>


class SomeClass
{
template <int N, typename ExtractedType>
bool ExtractDataFromArray(std::array<uint8_t, N> &ExtractFrom,
                          uint8_t StartBit, uint8_t BitLen, ExtractedType &out);
};

template <int N, typename ExtractedType>
bool SomeClass::ExtractDataFromArray(std::array<uint8_t, N> &ExtractFrom,
                                               uint8_t StartBit, uint8_t BitLen, ExtractedType &out) 
{
    return true;
}

template<>
bool SomeClass::ExtractDataFromArray<8, int>(std::array<uint8_t, 8>&, uint8_t, uint8_t, int &)
{
    return false;
}

推荐阅读