字符串装饰器类导致许多构建错误

时间:2017-03-07 04:35:53

标签: c++ visual-c++ visual-studio-2015

我已经为std :: string创建了一个装饰器类,当它包含在项目中时,会导致数千个来自cmath.h,cstring.h,xstring.h等文件的构建错误。为什么。项目中需要字符串操作的所有文件都使用此类而不是std :: string来保持一致性。

我试图慢慢评论装饰者类的部分内容,试图弄清楚实际发生了什么,但是一旦整个课程被注释掉,错误才开始变得有意义。这里列出的错误太多,但错误的一小部分包括:

Error   C2733   'abs': second C linkage of overloaded function not allowed
Error   C2065   'allocator': undeclared identifier
Error   C2974   'std::basic_string': invalid template argument for '_Alloc'
Error   C2873   'strxfrm': symbol cannot be used in a using-declaration
Error   C2535   'void std::basic_string<_Elem,_Traits,_Alloc>::_Construct(_Iter,_Iter)': member function already defined or declared

多个标准库文件中存在数千个这样的错误。这是字符串装饰器的头文件:

#pragma once

#include <string>
#include <vector>

namespace Framework
{
    class String
    {
    private:
        std::string Data;

    public:
        String();
        String(const char*Init);
        String(int Init);

        friend String operator+(String &LHS, String &RHS);  
        friend String operator+(String &LHS, const char *RHS);
        friend String operator+(String &LHS, const char RHS);

        String& operator+=(String &RHS);
        String& operator+=(const char *RHS);
        String& operator+=(const char RHS);

        friend bool operator==(String &LHS, String &RHS);
        friend bool operator==(const String &LHS, const String &RHS);
        friend bool operator==(String &LHS, const char *RHS);
        friend bool operator==(const String &LHS, const char *RHS);

        friend bool operator!=(String &LHS, String &RHS);
        friend bool operator!=(const String &LHS, const String &RHS);
        friend bool operator!=(String &LHS, const char *RHS);

        String& operator=(const char * RHS);

        char operator[](int Index);

        size_t Length();
        size_t IndexOf(String SubString, size_t Offset = 0);

        bool Contains(String SubString, size_t Offset = 0);         
        String SubString(size_t Start, size_t Count = 0);           
        std::vector<String> Split(char Delimeter, bool KeepEmpty = false);

        const char *ToCharString();

        void Insert(int Position, String Text);
        void RemoveAt(int Index);

        int ToInt();
        double ToDouble();          
        bool ToBoolean();
        unsigned __int8 ToByte();
    };      
}

这让人感到更加困惑的是,这个外观在另一个项目中完美运作,它只是在这个新项目中似乎失败了。

1 个答案:

答案 0 :(得分:1)

我不完全确定导致此问题的原因,但它的解决方法是将String.h和String.cpp文件移动到项目中的子文件夹,而不是让它位于项目的根目录下。一旦我完成了这一切并将所有内容恢复为使用Framework :: String,项目就构建得很好。

关于为什么这样做有用的线索可能是因为如果我在String.h和String.cpp仍然在根目录中并且选择了Open Document时右键单击"${PODS_ROOT}/Fabric/run" YOUR_API_KEY YOUR_BUILD_SECRET 行,它就打开了标准库string.h文件而不是我的String.h文件。