Linux汇编器错误C++。

3

我试过在谷歌上搜索这个错误,但没有找到任何有用的信息。由于我是编程新手,请耐心等待。这个错误是在我第一次编译card.cpp时出现的,从那以后就一直没有消失。所有我的cpp文件都会给出相同的错误。当我输入 g++ card.cpp(或任何一个.cpp文件)进行编译时,我不断地得到这个错误 -

/tmp/ccW6ByXY.s: Assembler messages:
/tmp/ccW6ByXY.s:13: Error: symbol `_ZNSi6ignoreE' is already defined
/tmp/ccW6ByXY.s:25: Error: symbol `_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreE' is already defined

我有我的驱动程序和3个 .h 文件(以及它们各自的 .cpp 文件)。当我单独编译每个文件或一起编译时,它们都会显示此消息。任何信息都将不胜感激。
#include "card.h"
//using namespace std;


Card::Card()
{
    rank = 'A';
    suit = spades;
}

Card::Card(int _rank, Suit _suit)
{
    rank = _rank;
    suit = _suit;
}

string Card::toString() const //return string of card (ie 2h)
{
    string cardString = suitString() + rankString();
    return cardString;
}

int Card::getRank() const
{
    return rank;
}

Card::Suit Card::getSuit() const
{
    return suit;
}

bool Card::operator == (const Card &rhs) const
{
    return (rank==rhs.rank) || (suit == rhs.suit);
}

string Card::suitString() const
{
    Suit s = spades;
    switch(s)
    {
        case spades: return "s";
            break;
        case hearts: return "h";
            break;
        case diamonds: return "d";
            break;
        case clubs: return "c";
            break;
    }
}

以下是card.h文件

#ifndef _CARD_H
#define _CARD_H


#include <iostream>
#include <string>
using namespace std;

class Card
{
public:

    enum Suit {spades, hearts, diamonds, clubs};

    Card();                     // default: ace of spades

    Card(int, Suit);

    string toString()   const;  // return string version: Ac 4h Js
    int   getRank()     const;  // return rank, 1..13
    Suit  getSuit()     const;  // return suit


    bool operator == (const Card &rhs) const;

private:

    int rank;
    Suit suit;

    string suitString()  const;  // return "s", "h",...
    string rankString()  const;  // return "A", "2", ..."Q"

};

#endif

1
请添加您的构建命令。 - Pradhan
我已经为您格式化了代码(A样式),这样我和其他人就可以比以前更容易阅读它了。还请注意,以下划线开头的名称是保留给实现的。请参见:https://dev59.com/KHVC5IYBdhLWcg3woSxW - Brandon
除了领先下划线名称被保留外,您还缺少“string Card :: rankString()const”实现,因此您的代码无法编译。 您还缺少suitString的默认情况或默认返回值。在头文件中执行using namespace std是不良实践。添加这些后,我能够编译您的代码而无需错误。您看到的错误必须来自其他地方。 - Brandon
1
在发布代码之前,你需要将其精简,因为你的代码过于冗长而且不完整。这不仅可以帮助你自己找到错误,也能让其他人更好地帮助你。另外我也想知道你在使用哪个编译器和版本,现代的编译器都应该能够识别并解码这些错误。 - Ulrich Eckhardt
@Ana 确认一下,当你使用命令 g++ Card.cpp 编译上述代码时,你会得到多个定义错误吗?如果是这样的话,我无法复现它(在进行一些简单的编译修复后)。 - Pradhan
显示剩余5条评论
1个回答

1
你所看到的是目标文件中一些符号的损坏名称。为了理解它们,可以使用 c++filt 命令进行如下操作:
$ c++filt -n _ZNSi6ignoreE
std::istream::ignore
$ c++filt -n _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreE
std::basic_istream<wchar_t, std::char_traits<wchar_t> >::ignore

好的!现在这些名称开始看起来熟悉了。所以,istream::ignore 存在于多个目标文件中。[在看到您的构建命令后继续 :)]


我打进去然后它给我了
std::basic_istream<char, std::char_traits<char> >::ignore std::basic_istream<wchar_t, std::char_traits<wchar_t> >::ignore 然后尝试编译,结果同样的错误再次出现。我不知道为什么它有这么多“char”,因为我在程序中没有任何一个 :(
- Ana
你的命令只是 g++ card.cpp 吗?然后你得到了这些错误?我不确定该怎么处理。能否展示一下 card.cpp 的内容? - Pradhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接