C++ C++;模板,在编译时解析未定义的类型

C++ C++;模板,在编译时解析未定义的类型,c++,templates,C++,Templates,假设我有一个模板类,IO和另一个模板类MembershipFunction。我需要在我的IO东西中有一个MembershipFunction*s的向量,还有一个std::map从std::string到MembershipFunction*。对我来说,用这么复杂的代码记东西是不可能的。尤其是在使用迭代器时。因此,我尝试将一些typedefs添加到IO。但听起来编译器无法看到嵌套的模板。下面列出了错误 我该怎么克服呢 #include <vector> #include <map

假设我有一个模板类,
IO
和另一个模板类
MembershipFunction
。我需要在我的
IO
东西中有一个
MembershipFunction*
s的向量,还有一个
std::map
std::string
MembershipFunction*
。对我来说,用这么复杂的代码记东西是不可能的。尤其是在使用迭代器时。因此,我尝试将一些
typedef
s添加到
IO
。但听起来编译器无法看到嵌套的模板。下面列出了错误

我该怎么克服呢

#include <vector>
#include <map>
#include <string>
#include <utility>
#include "membership_function.h" // for the love of god! 
                                 // MembershipFunction is defined there!
#include "FFIS_global.h"


template <typename T>
class DLL_SHARED_EXPORT IO
{
private:
    typedef std::pair<std::string,  MembershipFunction<T>* > MapEntry; // (1)
    typedef std::map<std::string, MembershipFunction<T>* > Map; // (2)
    typedef std::vector<const MembershipFunction<T>* > Vector; // (3)
    // And so on...
编辑:

这是
会员资格功能的代码

template <typename T>
class DLL_SHARED_EXPORT MembershipFunction
{
public:
    virtual T value(const T& input) const{return T();}
    virtual void setImplicationMethod(const typename  MFIS<T>::Implication& method);
};
模板
类DLL\u共享\u导出成员身份函数
{
公众:
虚拟T值(常量T&input)常量{return T();}
虚空setImplicationMethod(常量类型名MFIS::Implication&method);
};

IO
中使用
成员身份函数之前,必须先定义
成员身份函数。如果它们在不同的文件中,那么将它们包含在另一个文件中。

我复制/粘贴了您的代码,它可以用gcc编译。您的模板使用没有问题。编译器错误表明它以前从未见过该类型。我不在乎你是否包含这个文件,编译器因为某种原因看不到完整的定义。提前声明可能还不够。还不清楚DLL_共享_导出是什么,我怀疑这可能是罪魁祸首

在你否决我之前,请编辑以下内容并亲自查看:

#include <vector>
#include <map>
#include <utility>

template <typename T>
class  MembershipFunction
{
public:
    virtual T value(const T& input) const{return T();}
    //virtual void setImplicationMethod(const typename  MFIS<T>::Implication& method);
};


template <typename T>
class IO
{
private:
    typedef std::pair<std::string,  MembershipFunction<T>* > MapEntry; // (1)
    typedef std::map<std::string, MembershipFunction<T>* > Map; // (2)
    typedef std::vector<const MembershipFunction<T>* > Vector; // (3)
};
#包括
#包括
#包括
模板
类成员身份函数
{
公众:
虚拟T值(常量T&input)常量{return T();}
//虚空setImplicationMethod(常量类型名MFIS::Implication&method);
};
模板
IO类
{
私人:
typedef std::pair MapEntry;//(1)
typedef std::map map;//(2)
typedef std::vector vector;//(3)
};

是否包含MembershipFunction.h文件?嵌套的typedef是什么意思?请给出一个最小的工作示例。@rhalbersma好吧,那是嵌套模板。是的,它不是嵌套的!我的意思是在另一个模板类中使用模板类。。。我不知道正确的术语是什么。第一个错误是“未在此范围内定义”。那么在哪个作用域(类或名称空间)定义了
MembershipFunction
?@rhalbersma都是在
FFIS
名称空间中定义的,我包括
mf.h
中定义的
MembershipFunction
。我尝试从
MembershipFunction
中删除模板(使用
int
而不是
T
使其成为一个普通类),但没有出现错误。我认为这是模板的问题,而不是scope@sorush-r、 你的问题中没有任何东西表明你做了,错误消息暗示了其他情况。“未在此范围内声明”意味着无法识别类名,或者根本没有定义它,或者在错误的命名空间中定义了它。因此,我确信我包含了相应的头,并且两个类都在同一命名空间中。我还应该注意什么?@sorush-r,我唯一能想到的是
#如果
成员资格(u)函数中包含警卫。h
会阻止它被看到。它是否包含任何其他文件?如果你指的是哪个文件?在开始时只有一个代码> > IFNDEF < /C> >(与所有C++标题一样)和一个包含.CPP文件的代码。请参见代码:Oops!这是一个简单的圆形包含体
mfis.h
包括
io.h
io.h
包括
mf.h
mf.h
包括
mfis.h
。通常我会从
mfis.h
中删除include语句,并在那里向前声明
IO
。但在这里,我不知道如何使用模板…首先,我没有给出任何答案。第二,不需要测试。我知道它起作用了!它应该会起作用。我正在努力寻找我的代码没有编译的原因。在第三个类中使用代码之前,一切都编译得很好。然后,我将
IO
对象列表添加到名为
Aggregator
(空类)的类中,出现了错误。感谢您的回答。这是循环包含。虽然还没有解决!参见马克回答的最后一条评论
#include <vector>
#include <map>
#include <utility>

template <typename T>
class  MembershipFunction
{
public:
    virtual T value(const T& input) const{return T();}
    //virtual void setImplicationMethod(const typename  MFIS<T>::Implication& method);
};


template <typename T>
class IO
{
private:
    typedef std::pair<std::string,  MembershipFunction<T>* > MapEntry; // (1)
    typedef std::map<std::string, MembershipFunction<T>* > Map; // (2)
    typedef std::vector<const MembershipFunction<T>* > Vector; // (3)
};