| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5255 人关注过本帖
标题:求助!VS2005中 “无法解析的外部命令”问题
只看楼主 加入收藏
紫凤双飞
Rank: 2
等 级:论坛游民
帖 子:76
专家分:61
注 册:2011-3-26
结帖率:75%
收藏
已结贴  问题点数:40 回复次数:11 
求助!VS2005中 “无法解析的外部命令”问题
刚刚看了命名空间,就试用了一下,结果出现“无法解析的外部命令” 望解释一下
//stack.h
#ifndef _STACK_H_
#define _STACK_H_

namespace STACK
{
    const int maxsize=50;
    int UNDERFLOW=0;//下溢
    int OVERFLOW=0;//上溢
    template<class T>
    class stack
    {
    private:
        T *data;
        int index;
        int max;//该栈的最大长度
    public:
        stack(int num=maxsize);
        ~stack();
        void push(T);
        T pop();
        T gettop();
        int length();
        bool isempty();
        void print()const;
    };
}

#endif

//stack.cpp
#include<iostream>
#include"stack.h"
using namespace std;

template<class T>
STACK::stack<T>::stack(int num = maxsize)
{
    data=new T(num);
    index=0;
    max=num;
}

template<class T>
STACK::stack<T>::~stack()
{
    delete [] data;
}

template<class T>
T STACK::stack<T>::gettop()
{
    try
    {
        if(index==0)
            throw UNDERFOLW;
        return data[index];
    }
    catch UNDERFLOW
    {
        cout<<"发生下溢"<<endl;
    }
}

template<class T>
void STACK::stack<T>::push(T t)
{
    try
    {
        if(index==max)
            throw OVERFLOW;
        data[index];
        ++index;
    }
    catch OVERFLOW
    {
        cout<<"发生上溢"<<endl;
    }
}

template<class T>
T STACK::stack<T>::pop()
{
    try
    {
        if(index==0)
            throw UNDERFLOW;
        --index;
        return data[index];
    }
    catch UNDERFLOW
    {
        cout<<"发生下溢"<<endl;
    }
}

template<class T>
int STACK::stack<T>::length()
{
    return index;
}

template<class T>
bool STACK::stack<T>::isempty()
{
    if(index==max)
        return true;
    return false;
}

template<class T>
void STACK::stack<T>::print() const
{
    int j=length();
    for(int i=0;i<j;++i)
        cout<<data[i]<<' ';
    cout<<endl;
}
//main.cpp
#include<iostream>
#include"stack.h"
using namespace std;

void main()
{
    STACK::stack<int> intstack(10);
    STACK::stack<char> charstack(8);
    if(intstack.isempty()==true)
        cout<<"Int stack is empty"<<endl;
    else
        cout<<"Int stack isn't empty"<<endl;
    for(int i=0;i<9;++i)
        intstack.push(i);
    intstack.print();
    for(int i=0;i<5;++i)
    {
        char ch;
        ch='a'+i;
        charstack.push(ch);
    }
    charstack.print();
}
结果链接时出错:
1>------ 已启动生成: 项目: stack, 配置: Debug Win32 ------
1>正在编译...
1>main.cpp
1>正在链接...
1>main.obj : error LNK2005: "int STACK::UNDERFLOW" (?UNDERFLOW@STACK@@3HA) 已经在 stack.obj 中定义
1>main.obj : error LNK2005: "int STACK::OVERFLOW" (?OVERFLOW@STACK@@3HA) 已经在 stack.obj 中定义
1>main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall STACK::stack<int>::~stack<int>(void)" (??1?$stack@H@STACK@@QAE@XZ),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall STACK::stack<char>::~stack<char>(void)" (??1?$stack@D@STACK@@QAE@XZ),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall STACK::stack<char>::print(void)const " (?print@?$stack@D@STACK@@QBEXXZ),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall STACK::stack<char>::push(char)" (?push@?$stack@D@STACK@@QAEXD@Z),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall STACK::stack<int>::print(void)const " (?print@?$stack@H@STACK@@QBEXXZ),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall STACK::stack<int>::push(int)" (?push@?$stack@H@STACK@@QAEXH@Z),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: bool __thiscall STACK::stack<int>::isempty(void)" (?isempty@?$stack@H@STACK@@QAE_NXZ),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall STACK::stack<char>::stack<char>(int)" (??0?$stack@D@STACK@@QAE@H@Z),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall STACK::stack<int>::stack<int>(int)" (??0?$stack@H@STACK@@QAE@H@Z),该符号在函数 _main 中被引用
1>F:\Users\Administrator\Documents\Visual Studio 2005\Projects\stack\Debug\stack.exe : fatal error LNK1120: 9 个无法解析的外部命令
1>生成日志保存在“file://f:\Users\Administrator\Documents\Visual Studio 2005\Projects\stack\Debug\BuildLog.htm”
1>stack - 12 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

请问这是什么问题,如何解决啊?
搜索更多相关主题的帖子: index 空间 
2011-05-09 22:33
tisyang
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:132
专家分:737
注 册:2011-5-7
收藏
得分:0 
模板类的申明和定义不能跨两个文件,所有关于 你的 stack 类的声明和定义,包括函数定义,都必须放到 stack.h 文件里,跨文件都会出现编译问题,这个是编译器问题,但是,目前还没有哪个编译器支持模板类的申明和定义分离(跨文件)。

C++ 用无参数构造函数生成对象时候请勿在构造函数后添加无用的那一对括号,否则有可能会被当成函数声明而忽略,嗯,栈上构建的时候就是这样。
2011-05-10 01:37
lucky563591
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:765
专家分:2103
注 册:2009-11-18
收藏
得分:0 
我用2010时也出现过这类错误
2011-05-10 08:48
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
收藏
得分:10 
在main.cpp中,把stack.cpp也包含进去。
这样试试:
#include<iostream>
#include"stack.h"
#include"stack.cpp"
using namespace std;
2011-05-10 09:47
紫凤双飞
Rank: 2
等 级:论坛游民
帖 子:76
专家分:61
注 册:2011-3-26
收藏
得分:0 
回复 4楼 zhoufeng1988
修改之后,那个无法解析的外部命令没了
但有了重定义问题:
1>------ 已启动生成: 项目: stack, 配置: Debug Win32 ------
1>正在编译...
1>stack.cpp
1>Generating Code...
1>Compiling...
1>main.cpp
1>Generating Code...
1>正在链接...
1>stack.obj : error LNK2005: "int STACK::UNDERFLOW" (?UNDERFLOW@STACK@@3HA) 已经在 main.obj 中定义
1>stack.obj : error LNK2005: "int STACK::OVERFLOW" (?OVERFLOW@STACK@@3HA) 已经在 main.obj 中定义

1>F:\Users\Administrator\Documents\Visual Studio 2005\Projects\stack\Debug\stack.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
1>生成日志保存在“file://f:\Users\Administrator\Documents\Visual Studio 2005\Projects\stack\Debug\BuildLog.htm”
1>stack - 3 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

在那部分加了#ifndef...也没用:
程序代码:
#ifndef _UNDERFLOW_
#define _UNDERFLOW_
    int UNDERFLOW=0;//下溢
#endif
#ifndef _OVERFLOW_
#define _OVERFLOW_
    int OVERFLOW=0;//上溢
#endif


这个该怎么办啊?
2011-05-10 15:17
tisyang
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:132
专家分:737
注 册:2011-5-7
收藏
得分:0 
回复 5楼 紫凤双飞
都说过了,把stack.cpp 的内容放到 stack.h 里面去,stack类的所有信息都在一个文件就可以了

C++ 用无参数构造函数生成对象时候请勿在构造函数后添加无用的那一对括号,否则有可能会被当成函数声明而忽略,嗯,栈上构建的时候就是这样。
2011-05-10 15:19
紫凤双飞
Rank: 2
等 级:论坛游民
帖 子:76
专家分:61
注 册:2011-3-26
收藏
得分:0 
回复 6楼 tisyang
不是,是可以跨文件的,就像4楼说的那样,而且之前看到一本书上提到的,所以才会尝试嘛
2011-05-10 15:26
紫凤双飞
Rank: 2
等 级:论坛游民
帖 子:76
专家分:61
注 册:2011-3-26
收藏
得分:0 
回复 6楼 tisyang
而且现在是重定义的问题啊
2011-05-10 15:27
tisyang
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:132
专家分:737
注 册:2011-5-7
收藏
得分:0 
以下是引用紫凤双飞在2011-5-10 15:26:14的发言:

不是,是可以跨文件的,就像4楼说的那样,而且之前看到一本书上提到的,所以才会尝试嘛

跨文件的在C++标准里是 export 关键字,但是貌似主流编译器都不支持这个关键字,好像是因为实现起来过于复杂。
具体可以看这篇文章和评论。
http://www.

C++ 用无参数构造函数生成对象时候请勿在构造函数后添加无用的那一对括号,否则有可能会被当成函数声明而忽略,嗯,栈上构建的时候就是这样。
2011-05-10 15:29
tisyang
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:132
专家分:737
注 册:2011-5-7
收藏
得分:30 
回复 8楼 紫凤双飞
重定义是因为你同时包含了 头文件和实现文件,其实就算你同时包含不出现任何问题的话,你的设计就有问题了。
将类的声明和定义分开放到两个文件的目的是将具体的实现隐藏,不暴露给外部用户。一般这样分开设计的类,用的时候只要包含头文件就可以了,如果类的声明没有变,但是定义发生了改变的话,引用该类的源文件不需要重新编译,只需要重新链接就可以了。
但是你这样的分开设计,必须包含实现文件的话,和本来放到一个文件有什么区别呢,不能隐藏细节。类的任何改变都还需要将源文件重新编译和链接。只是看起来分开了而已,实质上还是连在一起的。

C++ 用无参数构造函数生成对象时候请勿在构造函数后添加无用的那一对括号,否则有可能会被当成函数声明而忽略,嗯,栈上构建的时候就是这样。
2011-05-10 15:35
快速回复:求助!VS2005中 “无法解析的外部命令”问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.057296 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved