关于VS2008 c++编译错误 之 无法解析外部命令的问题。
我在编带模板的类继承带模板的虚基类的c++程序时,本来想把成员函数在类中声明,类外定义。。当我把成员函数声明和成员函数定义写在同一个.h文件中时,程序可以正确执行,现在是...
我在编带模板的类 继承 带模板的虚基类的c++程序时,本来想把成员函数在类中声明,类外定义。。当我把成员函数声明和成员函数定义写在同一个.h文件中时,程序可以正确执行,现在是问题所在,当我把函数实现放在另一个.cpp文件中时(有包含.h的头文件),却无法通过。显示的编译错误为
1>正在链接...
1>another list.obj : error LNK2019: 无法解析的外部符号 "public: virtual bool __thiscall Alist<int>::append(int const &)" (?append@?$Alist@H@@UAE_NABH@Z),该符号在函数 _main 中被引用
1>another list.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __thiscall Alist<int>::insert(int const &)" (?insert@?$Alist@H@@UAE_NABH@Z)
1>another list.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __thiscall Alist<int>::remove(int &)" (?remove@?$Alist@H@@UAE_NAAH@Z)
1>C:\Users\tao\Documents\Visual Studio 2008\Projects\another list\Debug\another list.exe : fatal error LNK1120: 3 个无法解析的外部命令
1>生成日志保存在“file://c:\Users\tao\Documents\Visual Studio 2008\Projects\another list\another list\Debug\BuildLog.htm”
1>another list - 4 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
我看网站关于无法解析外部命令,感觉好像是连接错误。我想可能和VS2008的
#include "stdafx.h"有关,不知道有哪位大神能帮忙解决下。一定加份。。
附上函数片段
虚基类:
template <class Elem>
class List {
public:
virtual void clear () = 0;
virtual bool insert (const Elem& ) = 0;
virtual bool append (const Elem& ) = 0;
virtual bool remove (Elem& ) = 0;
类模板:
template <class Elem>
class Alist: public List <Elem>{
private:
int maxSize;
int listSize;
int fence;
Elem * listArray;
public:
Alist( int size = 500 ) {
maxSize = size;
listSize = fence = 0;
listArray = new Elem [maxSize];
}
~Alist() { delete [] listArray; }
void clear( ) {
delete[] listArray;
listSize = fence =0;
listArray = new Elem[maxSize];
}
bool insert(const Elem& );
bool append(const Elem& );
bool remove(Elem& );
函数实现:
template <class Elem>
bool Alist<Elem>::insert(const Elem& item){
if(listSize == maxSize) return false;
for(int i=listSize; i>fence;i--)
listArray[i] = listArray[i-1];
listArray[fence] = item;
listSize++;
return true;
}
template <class Elem>
bool Alist<Elem>::append(const Elem& item ){
if (listSize == maxSize ) return false;
listArray[listSize++] = item;
return true;
}
template <class Elem>
bool Alist<Elem>::remove( Elem& it){
if (rightLength( ) == 0) return false;
it = listArray[fence];
for( int i = fence; i< listSize-1;i++)
listArray[i] = listArray[i+1];
listSize--;
return true;
}
问题就出现在那三个函数上,成员函数实现和声明放同一个.h文件就没问题,可以执行,就是我想把实现放一个.cpp时就出现这个错误了,问题有点长了!~ 展开
1>正在链接...
1>another list.obj : error LNK2019: 无法解析的外部符号 "public: virtual bool __thiscall Alist<int>::append(int const &)" (?append@?$Alist@H@@UAE_NABH@Z),该符号在函数 _main 中被引用
1>another list.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __thiscall Alist<int>::insert(int const &)" (?insert@?$Alist@H@@UAE_NABH@Z)
1>another list.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __thiscall Alist<int>::remove(int &)" (?remove@?$Alist@H@@UAE_NAAH@Z)
1>C:\Users\tao\Documents\Visual Studio 2008\Projects\another list\Debug\another list.exe : fatal error LNK1120: 3 个无法解析的外部命令
1>生成日志保存在“file://c:\Users\tao\Documents\Visual Studio 2008\Projects\another list\another list\Debug\BuildLog.htm”
1>another list - 4 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
我看网站关于无法解析外部命令,感觉好像是连接错误。我想可能和VS2008的
#include "stdafx.h"有关,不知道有哪位大神能帮忙解决下。一定加份。。
附上函数片段
虚基类:
template <class Elem>
class List {
public:
virtual void clear () = 0;
virtual bool insert (const Elem& ) = 0;
virtual bool append (const Elem& ) = 0;
virtual bool remove (Elem& ) = 0;
类模板:
template <class Elem>
class Alist: public List <Elem>{
private:
int maxSize;
int listSize;
int fence;
Elem * listArray;
public:
Alist( int size = 500 ) {
maxSize = size;
listSize = fence = 0;
listArray = new Elem [maxSize];
}
~Alist() { delete [] listArray; }
void clear( ) {
delete[] listArray;
listSize = fence =0;
listArray = new Elem[maxSize];
}
bool insert(const Elem& );
bool append(const Elem& );
bool remove(Elem& );
函数实现:
template <class Elem>
bool Alist<Elem>::insert(const Elem& item){
if(listSize == maxSize) return false;
for(int i=listSize; i>fence;i--)
listArray[i] = listArray[i-1];
listArray[fence] = item;
listSize++;
return true;
}
template <class Elem>
bool Alist<Elem>::append(const Elem& item ){
if (listSize == maxSize ) return false;
listArray[listSize++] = item;
return true;
}
template <class Elem>
bool Alist<Elem>::remove( Elem& it){
if (rightLength( ) == 0) return false;
it = listArray[fence];
for( int i = fence; i< listSize-1;i++)
listArray[i] = listArray[i+1];
listSize--;
return true;
}
问题就出现在那三个函数上,成员函数实现和声明放同一个.h文件就没问题,可以执行,就是我想把实现放一个.cpp时就出现这个错误了,问题有点长了!~ 展开
4个回答
展开全部
两种编译模式:
---------
C++ Primer 第三版 中文版
10.5 模板编译模式:
"C++支持两种模板编译模式包含模式Inclusion Model 和分离模式Separation Model"
10.5.1 包含编译模式
"在包含编译模式下我们在每个模板被实例化的文件中包含函数模板的定义并且往往把定义放在头文件中像对内联函数所做的那样"
10.5.2 分离编译模式
"在分离编译模式下函数模板的声明被放在头文件中"
"在模板定义中有一个关键字export"
"关键字export 告诉编译器在生成被其他文件使用的函数模板实例时可能需要这个模板定义编译器必须保证在生成这些实例时该模板定义是可见的"
"关键字export 不需要出现在头文件的模板声明中"
"分离模式使我们能够很好地将函数模板的接口同其实现分开进而组织好程序以便把函数模板的接口放到头文件中而把实现放在文本文件中但是并不是所有的编译器都支持分离模式即使支持也未必总能支持得很好支持分离模式需要更复杂的程序设计环境所以它们不能在所有C++编译器实现中提供"
"Inside the C++ Object Model 描述了一个C++编译器the Edison Design Group compiler支持的模板实例化机制"
-----------
到2008不支持....
2010卸了没试
-----------
警告 1 warning C4237: 目前还不支持“export”关键字,但已保留该关键字供将来使用 x:\xxxx\xxxx\list.cpp 3 xxxx
---------
C++ Primer 第三版 中文版
10.5 模板编译模式:
"C++支持两种模板编译模式包含模式Inclusion Model 和分离模式Separation Model"
10.5.1 包含编译模式
"在包含编译模式下我们在每个模板被实例化的文件中包含函数模板的定义并且往往把定义放在头文件中像对内联函数所做的那样"
10.5.2 分离编译模式
"在分离编译模式下函数模板的声明被放在头文件中"
"在模板定义中有一个关键字export"
"关键字export 告诉编译器在生成被其他文件使用的函数模板实例时可能需要这个模板定义编译器必须保证在生成这些实例时该模板定义是可见的"
"关键字export 不需要出现在头文件的模板声明中"
"分离模式使我们能够很好地将函数模板的接口同其实现分开进而组织好程序以便把函数模板的接口放到头文件中而把实现放在文本文件中但是并不是所有的编译器都支持分离模式即使支持也未必总能支持得很好支持分离模式需要更复杂的程序设计环境所以它们不能在所有C++编译器实现中提供"
"Inside the C++ Object Model 描述了一个C++编译器the Edison Design Group compiler支持的模板实例化机制"
-----------
到2008不支持....
2010卸了没试
-----------
警告 1 warning C4237: 目前还不支持“export”关键字,但已保留该关键字供将来使用 x:\xxxx\xxxx\list.cpp 3 xxxx
展开全部
要调用模板方法,必须在调用模块有其定义。因为模板方法由于参数类型不确定,本身就不能编译为单一的可执行代码。
普通函数可以在别的模块(CPP文件)编译,然后可链接定位到。
但模板(泛型)方法不可单独编译,只能在调用时,将特定参数类型代入模板,形成一个具体函数,该函数才可编译。而编译该具体函数又不可脱离模板函数的具体定义。
必须将实际调用参数及类型传入模板方法定义后,才能形成一个特定的方法。所以要调用模板方法的地方,必须知道其定义才行。
模板类似于宏,只是形式更规范,多了一些类型检查机制。
普通函数可以在别的模块(CPP文件)编译,然后可链接定位到。
但模板(泛型)方法不可单独编译,只能在调用时,将特定参数类型代入模板,形成一个具体函数,该函数才可编译。而编译该具体函数又不可脱离模板函数的具体定义。
必须将实际调用参数及类型传入模板方法定义后,才能形成一个特定的方法。所以要调用模板方法的地方,必须知道其定义才行。
模板类似于宏,只是形式更规范,多了一些类型检查机制。
追问
具体怎么做还是没说啊!~
追答
必须把同一个模板函数的声明和定义放在同一个文件里。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
项目 属性 配置属性 C/C++ 代码生成 运行库 多线程调试 MDd (我用的是MDd,你也可以看下另一个多线程调试是否能用)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把类(函数)声明的.h文件引用 放到 stdafx.h或者 有MAIN()的文件中
追问
不行!~
#include "stdafx.h"
#include
using namespace std;
template
bool Alist::insert(const Elem& item);
template
bool Alist::append(const Elem& item );
template
bool Alist::remove( Elem& it);
int main(int argc, char* argv[])
{
。。。。。。
}
还是不行,百度不给贴太多东西!~贴不了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询