c++类模板特化,声明与实现在一个文件里,为什么编译不通过

时间:2021-03-08 18:11:27
在Task.h文件里,我声明与实现了类模板与特化,但是编译却说特化的那个函数找不到不匹配的。如果声明与定义都写在一起,编译不会报错,谁知道为什么??
template <class T>
class MyClass
{
public:
   bool Execute(T entity);
}

template <>
MyClass<char*>
{
public :
   bool Execute(char* entity);
}
/*分离出来的实现*/
template <class T>
bool MyClass<T>::Execute(T entity)
{
}

template <>
bool MyClass<char*>::Execute(char* Entity)
{
}

9 个解决方案

#1


编译器不支持。。

#2


模板这东西,何必自找麻烦地要分离出来写呢。

#3


声明文件里要包含(include)定义文件

#4


分离出来后要加类模板的那个文件名吧

#5


1楼同学:
我只是分离出来,但并没有把实现放到.cpp文件里。如果我只是去掉那个特化的函数,不动其他地方,还是能编译的。

2楼同学:

  很久以前学的c++,最近要用才开始复习,想到c++标准是希望能分离的,不知道如今编译器是否大多支持。
   而且它报错是说找不到匹配的模板函数,只是特化的那个函数被认为有错。

3,4楼同学:

   我把声明和实现都放在Task.h里了,Task.cpp除了include "Task.h",啥都没写

#6


编译器的问题,如果你将函数的实现放到特化的类里面去是没有问题的。似乎我用过的vs2008,dev-cpp都不支持将特化的类的成员函数的实现写出来。

#8


下面这样就行了。

template <class T>
class MyClass
{
 public:
  bool Execute(T entity);
};

template <>
class MyClass<char*>
{
 public :
  bool Execute(char*);
};

template <class T>
bool MyClass<T>::Execute(T entity)
{
 return false;
}

bool MyClass<char*>::Execute(char*)
{
 return false;
}

int main ()
{
 return 0;
}

#9


人家就是这样规定的...

#1


编译器不支持。。

#2


模板这东西,何必自找麻烦地要分离出来写呢。

#3


声明文件里要包含(include)定义文件

#4


分离出来后要加类模板的那个文件名吧

#5


1楼同学:
我只是分离出来,但并没有把实现放到.cpp文件里。如果我只是去掉那个特化的函数,不动其他地方,还是能编译的。

2楼同学:

  很久以前学的c++,最近要用才开始复习,想到c++标准是希望能分离的,不知道如今编译器是否大多支持。
   而且它报错是说找不到匹配的模板函数,只是特化的那个函数被认为有错。

3,4楼同学:

   我把声明和实现都放在Task.h里了,Task.cpp除了include "Task.h",啥都没写

#6


编译器的问题,如果你将函数的实现放到特化的类里面去是没有问题的。似乎我用过的vs2008,dev-cpp都不支持将特化的类的成员函数的实现写出来。

#7


#8


下面这样就行了。

template <class T>
class MyClass
{
 public:
  bool Execute(T entity);
};

template <>
class MyClass<char*>
{
 public :
  bool Execute(char*);
};

template <class T>
bool MyClass<T>::Execute(T entity)
{
 return false;
}

bool MyClass<char*>::Execute(char*)
{
 return false;
}

int main ()
{
 return 0;
}

#9


人家就是这样规定的...