C ++模板定义导致未知类型名称

时间:2014-02-24 21:55:16

标签: c++ templates

我正在学习C ++中的模板。在MyClass.h中:

template <class valueType>
void valueToMap(const std::string key, const valueType value);

在MyClass.cpp中:

void MyClass::valueToMap(const std::string key, const valueType value) // error
                                                      ^
{
    _map[key] = std::to_string(value);
}

错误是:未知类型名称'valueType' 我已经包含了头文件,所以我做错了什么?

4 个答案:

答案 0 :(得分:3)

它必须是一个模板

template <typename valueType>
void MyClass<valueType>::valueToMap(const std::string key, const valueType value) // error
                                                      ^
{
    _map[key] = std::to_string(value);
}

然而 请记住:

Why can templates only be implemented in the header file?

答案 1 :(得分:1)

您需要在声明和定义中重复模板:

template <class valueType>
void MyClass::valueToMap(const std::string key, const valueType value)
{
    _map[key] = std::to_string(value);
}

答案 2 :(得分:1)

你应该添加

template <class valueType>

也在方法实施和更改之前

void MyClass:: ...

void MyClass<valueType>:: ...

答案 3 :(得分:1)

处理模板时,不能将类声明和类实现分成单独的文件(至少不包括.h文件末尾的.cpp文件)。这是由于模板的编译方式。

执行您要做的事情的最简单方法是内联您的函数:

template <class valueType> // assuming this is also at the class level
void valueToMap(const std::string key, const valueType value)
{
    _map[key] = std::to_string(value);
}

或者将实现放在头文件中的类声明之后:

template<class valueType>
class MyClass
{
public:
    void valueToMap(const std::string key, const valueType value);
};

template<class valueType>
void MyClass<valueType>::valueToMap(const std::string key, const valueType value)
{
    _map[key] = std::to_string(value);
}