【问题标题】:Declaration of templated class member function returning a map返回映射的模板类成员函数的声明
【发布时间】:2015-12-08 00:51:24
【问题描述】:

在 VC++ 2015 中,我有一个未模板化的类,它应该有一个返回映射的模板化成员函数。

下面是一些代码:

class Registry
{
    template<class configclass>
    std::map<std::wstring, configclass> enumerateSubKeys(std::wstring subKeyName);
}

但是编译器会抛出错误消息:
错误 C2988:无法识别的模板声明/定义
错误 C2143:语法错误:缺少“;”在“ 错误 C2238:“;”之前的意外令牌
错误 C2059:语法错误:“

我认为我的问题是必须使用一个映射,其中 wstring 必须被固定/取消模板化,但第二个参数是我的模板类。

当然,我遵循了编译器的建议,但这并没有让我更进一步。

【问题讨论】:

  • 如果我在类定义的末尾添加 ; ,则编译良好。这些错误可能与此有关。
  • @Kevin 不包含某些头文件将无法正常编译。
  • 没错,也许我错误地认为它们包含在发布的代码之上。

标签: c++


【解决方案1】:

您需要#include &lt;map&gt; 并在类声明的末尾添加一个分号。

正如@Kevin 和@juanchopanza 在 cmets 中指出的那样,您只是缺少一个分号,并且可能缺少一个包含。在VS2013中使用以下程序:

class Registry
{
    template<class configclass>
    std::map<std::wstring, configclass> enumerateSubKeys(std::wstring subKeyName);
}

int main()
{
}

我收到了您列出的各种错误:

错误 C2143:语法错误:缺少 ';'在'之前 错误 C2238:“;”之前的意外标记
错误 C2988:无法识别的模板声明/定义
错误 C2059:语法错误:'

还有:

错误 C2039 : 'map' : is not a member of 'std'

一旦我为std::map 添加了一个包含,错误就会减少:

#include <map>

class Registry
{
    template<class configclass>
    std::map<std::wstring, configclass> enumerateSubKeys(std::wstring subKeyName);
}

错误 C2628 : 'Registry' 后跟 'int' 是非法的(你忘记了 ';' 吗?)

这表明您在类声明的末尾缺少分号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2014-02-11
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多