Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用;奇怪的重复模板模式“;在多文件程序中_C++_Templates_Crtp - Fatal编程技术网

C++ 使用;奇怪的重复模板模式“;在多文件程序中

C++ 使用;奇怪的重复模板模式“;在多文件程序中,c++,templates,crtp,C++,Templates,Crtp,我是一个非常新手(C++程序员),刚刚发现了用于记录属于特定类的对象数量的CRTP 我是这样实现的: template <typename T> struct Counter { Counter(); virtual ~Counter(); static int count; }; template <typename T> Counter<T>::Counter() { ++count; } template <t

我是一个非常新手(C++程序员),刚刚发现了用于记录属于特定类的对象数量的CRTP

我是这样实现的:

template <typename T>
struct Counter
{
    Counter();
    virtual ~Counter();

    static int count;
};

template <typename T> Counter<T>::Counter()
{
    ++count;
}

template <typename T> Counter<T>::~Counter()
{
    --count;
}

template <typename T> int Counter<T>::count(0);
模板
结构计数器
{
计数器();
虚拟计数器();
静态整数计数;
};
模板计数器::计数器()
{
++计数;
}
模板计数器::~计数器()
{
--计数;
}
模板int计数器::计数(0);
这似乎有效。但是,它似乎不喜欢在单独的头文件中继承它,我在头文件中声明:

class Infector : public Counter<Infector>
{
    public:
        Infector();
        virtual ~Infector();

        virtual void infect(Infectee target);
        virtual void replicate() = 0;
        virtual void transmit() = 0;

    protected:
    private:
};
类感染者:公共计数器
{
公众:
感染者();
虚拟感染者();
虚拟空洞感染(感染对象目标);
虚拟空复制()=0;
虚空传输()=0;
受保护的:
私人:
};
没有继承,一切都可以正常编译,所以我相当肯定它看不到模板的声明和定义。有没有人对我可能出了什么问题以及我能做些什么有什么建议?我应该在我的Infector定义之前使用extern来让编译器知道计数器模板之类的东西吗

干杯


Kyle

我注意到您特别提到了声明和定义。
你们有单独的档案吗


如果是这样,则模板仅为标题生物。您需要将定义放在头文件中。

您是否记得包含定义计数器的文件(即#include“Counter.h”)?您必须发布看到的错误消息。我们不是通灵者。还有,你在用什么编译器?CRTP可能会严重影响一些较旧的编译器。如果您仍在使用GCC 3.4(MinGW只是最近才在4.4版中使用GCC 4),您可能会因此而遇到问题。我可以混合版本,但我想我在编译器中有无限循环,在MingWGCC3.4中做类似的模板欺骗。5@sbi,很抱歉没有包括具体的错误消息,它们基本上是按照“在token'之前预期的关键字模板听起来不适合Chris写的。啊,太棒了。谢谢。我将把模板移动到一个头文件,我把它作为一个链接的对象文件,我想这不足以让代码的其余部分知道它。干杯