尝试创建类模板时没有命名类型错误

时间:2015-02-25 18:50:10

标签: c++ templates compiler-errors

我收到此错误>>当我尝试为文件运行make时,不会命名类型错误does not name type。我试着到处寻找,但无法找到解决方法。请帮忙!

templateex.cpp

#include <stddef.h>
#include <assert.h>

template<class T>
templateex<T>::templateex()
{
    cout<<"Constructor Executing"<<endl;

    noValidEntries=0;
}

templateex.h

#include <iostream>
using namespace std;
#define SIZE 20

template <class T> class templateex
{
public:
   templateex();                     // default constructor

};
#include "templateex.cpp"

Main.cpp的

#include "templateex.h"   
int main()
{ 
templateex<int>example;
} 

错误

templateex.cpp:5:1: error: 'templateex' does not name a type

1 个答案:

答案 0 :(得分:0)

Templateex.h

#ifndef MY_TEMPLATEEX_H
#define MY_TEMPLATEEX_H

template <class T>
class Templateex
{
public:
    Templateex();

private:
    int noValidEntries_;
};

#include "Templateex.inl"
#endif

Templateex.inl

#ifndef MY_TEMPLATEEX_INL
#define MY_TEMPLATEEX_INL

#include<iostream>

template <class T>
Templateex<T>::Templateex()
{
    std::cout << "Constructor Executing" << std::endl;
    noValidEntries_ = 0;
}

#endif

的main.cpp

#include "Templateex.h"

int main()
{
    Templateex<int> example;
}
  1. 编译器在实例化时需要查看模板的定义,本质上要求模板包含在一个头文件中。但是,将模板类定义与其声明分离是一种很好的方式,特别是对于复杂的定义。因此,“#include Templateex.inl”。

  2. 通常模板定义文件(本质上是头文件)不应使用“cpp”扩展名,因为默认情况下许多工具(例如GNU make)假设“* .cpp”文件是源文件,* .inl这是一个很好的名字。

  3. 使用#ifndef #define ... #endif防范多重内容。

  4. 不要在头文件中“使用namespace std”,始终使用完全限定名称。 “using ..”的作用是使“namespace std”中的所有名称都可用。由于头文件可能包含在许多不同的编译单元中,因此头文件中名称空间中的导出名称会污染其他名称空间。 “using namespace ...”的使用应限制在单个编译单元中,即仅限于源文件中。

  5. 您没有声明变量“noValidEntries”......