C++ bcc32:专门研究“std::vector”时出现奇怪错误<;布尔>`

C++ bcc32:专门研究“std::vector”时出现奇怪错误<;布尔>`,c++,templates,c++builder,borland-c++,C++,Templates,C++builder,Borland C++,当traits类专门用于std::vector时,经典的32位Borland/Embarcadero编译器(又称bcc32)会出现奇怪的故障。特别是,它未能汇编专业化的用法,因为它找不到任何成员。对于其他类型,如std::vector,根本没有问题。使用BC++5.5.1(免费)和BC++7.1(RX/Seattle)进行测试 有解决办法吗 #include <iostream> #include <typeinfo> #include <vector> t

当traits类专门用于
std::vector
时,经典的32位Borland/Embarcadero编译器(又称bcc32)会出现奇怪的故障。特别是,它未能汇编专业化的用法,因为它找不到任何成员。对于其他类型,如
std::vector
,根本没有问题。使用BC++5.5.1(免费)和BC++7.1(RX/Seattle)进行测试

有解决办法吗

#include <iostream>
#include <typeinfo>
#include <vector>

template<typename T>
struct traits {  };

template<> struct traits< std::vector<char> >
{
   enum {  ENUM = 42  };

   static int func ()  {  return ENUM;  }
};

template<> struct traits< std::vector<bool> >
{
   enum {  ENUM = 666  };

   static int func ()  {  return ENUM;  }
};

///////////////////////////////////////////////////////////////////////////////////////////////////

template<typename T>
void test ()
{
   typedef traits<T> TT;

   // separate lines to see exactly where the compiler barfs
   std::cout << typeid(T).name();
   std::cout << " " << TT::ENUM;        // E2451 Undefined symbol 'ENUM'
   std::cout << " " << TT::func();      // E2451 Undefined symbol 'func'

   TT tt;
   std::cout << " " << tt.ENUM;         // E2316 'ENUM' is not a member of 'traits<std::_Bvector>'
   std::cout << " " << tt.func();       // E2316 'func' is not a member of 'traits<std::_Bvector>'
   std::cout << "\n";
}

int main ()
{
   test< std::vector<char> >();
   test< std::vector<bool> >();
   return 0;
}
#包括
#包括
#包括
模板
结构特征{};
模板结构特征
{
枚举{enum=42};
静态int func(){return ENUM;}
};
模板结构特征
{
枚举{enum=666};
静态int func(){return ENUM;}
};
///////////////////////////////////////////////////////////////////////////////////////////////////
模板
空隙试验()
{
typedef-TT;
//分隔行以查看编译器的确切位置

std::cout使用
std::vector
std:
中有些可疑,因此您需要使用
std::
类型。只需更改为:

#include <iostream>
#include <typeinfo>
#include <vector>
//---------------------------------------------------------------------------
template<typename T> struct traits
    {
    // this is safe constructor/destructor for Borland BDS2006 and later
    traits(){};
    traits(traits& a){};
    ~traits(){};
    traits* operator = (const traits *a){};
    //traits* operator = (const traits &a){}; // use this only if you have dynamic allocation members
    };

template<> struct traits< std::vector<char> >
    {
    enum {  ENUM = 42  };
    static int func ()  {  return ENUM;  }
    };

template<> struct traits< std::_Bvector >   // here use the std type directly
    {
    enum {  ENUM = 666  };
    static int func ()  {  return ENUM;  }
    };
//---------------------------------------------------------------------------
template<typename T> void test ()
    {
    typedef traits<T> TT;

    // separate lines to see exactly where the compiler barfs
    std::cout << typeid(T).name();
    std::cout << " " << TT::ENUM;        // E2451 Undefined symbol 'ENUM'
    std::cout << " " << TT::func();      // E2451 Undefined symbol 'func'

    TT tt;

    std::cout << " " << tt.ENUM;         // E2316 'ENUM' is not a member of 'traits<std::_Bvector>'
    std::cout << " " << tt.func();       // E2316 'func' is not a member of 'traits<std::_Bvector>'
    std::cout << "\n";

    // can ignore this ... it is just output to memo I do not use console
    AnsiString s="";
    s=s+typeid(T).name() + "\n";
    s=s+" " + AnsiString( TT::ENUM ) + "\r\n";        // E2451 Undefined symbol 'ENUM'
    s=s+" " + AnsiString( TT::func() ) + "\r\n";      // E2451 Undefined symbol 'func'
    s=s+" " + AnsiString( tt.ENUM ) + "\r\n";         // E2316 'ENUM' is not a member of 'traits<std::_Bvector>'
    s=s+" " + AnsiString( tt.func() ) + "\r\n";       // E2316 'func' is not a member of 'traits<std::_Bvector>'
    Form1->mm_log->Lines->Add(s);
    }
//---------------------------------------------------------------------------
// this is your main()
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner)
    {
    test< std::vector<char> >();
    test< std::vector<bool> >();
    }
//---------------------------------------------------------------------------
#包括
#包括
#包括
//---------------------------------------------------------------------------
模板结构特征
{
//这是Borland BDS2006及更高版本的安全构造函数/析构函数
性状(){};
特征(traits&a){};
~traits(){};
traits*操作符=(const traits*a){};
//traits*operator=(const traits&a){};//仅当您有动态分配成员时才使用此选项
};
模板结构特征
{
枚举{enum=42};
静态int func(){return ENUM;}
};
模板结构traits//这里直接使用std类型
{
枚举{enum=666};
静态int func(){return ENUM;}
};
//---------------------------------------------------------------------------
模板无效测试()
{
typedef-TT;
//分隔行以查看编译器的确切位置

Std::简单的解决方法是在C++ 1998标准化之后使用编译器。@ CH:正如我在文章的第一段提到的,BC32的版本7.10——去年秋天发布的RAD Studio RX/西雅图版本——与旧版本完全相同的问题。而且,不,在使用BC32时,使用标准不是一个选择。-兼容编译器。它就是它。@cheers-sandhth.-Alf因为它是
vector@Ami:我正在开发的代码的重点是面对性能(或缺乏性能)将
vector
vector
的性能进行比较,并将原始内存作为压缩位图处理,方法是将这些类型跟踪到具有不同特征的各种素筛实现中。另一点是,不仅要展示优化编译器(如gcc和VC++)的性能,还要展示非优化编译器(如bcc32和bcc/clang)的性能。因此,两者都
vector@DarthGizka:这是一个仅在中出现的问题,还是基于clang的编译器也受到影响?谢谢,专门研究
std::\u Bvector
std::allocator
而不是
std::vector
的技巧非常有效(使用bcc32 5.5.1和7.10测试),而且比我丑陋的黑客更干净!谢谢你在链接的文章中为析构函数问题提供详细的解决方案。太好了!@DarthGizka很高兴能帮上忙
#include <iostream>
#include <typeinfo>
#include <vector>
//---------------------------------------------------------------------------
template<typename T> struct traits
    {
    // this is safe constructor/destructor for Borland BDS2006 and later
    traits(){};
    traits(traits& a){};
    ~traits(){};
    traits* operator = (const traits *a){};
    //traits* operator = (const traits &a){}; // use this only if you have dynamic allocation members
    };

template<> struct traits< std::vector<char> >
    {
    enum {  ENUM = 42  };
    static int func ()  {  return ENUM;  }
    };

template<> struct traits< std::_Bvector >   // here use the std type directly
    {
    enum {  ENUM = 666  };
    static int func ()  {  return ENUM;  }
    };
//---------------------------------------------------------------------------
template<typename T> void test ()
    {
    typedef traits<T> TT;

    // separate lines to see exactly where the compiler barfs
    std::cout << typeid(T).name();
    std::cout << " " << TT::ENUM;        // E2451 Undefined symbol 'ENUM'
    std::cout << " " << TT::func();      // E2451 Undefined symbol 'func'

    TT tt;

    std::cout << " " << tt.ENUM;         // E2316 'ENUM' is not a member of 'traits<std::_Bvector>'
    std::cout << " " << tt.func();       // E2316 'func' is not a member of 'traits<std::_Bvector>'
    std::cout << "\n";

    // can ignore this ... it is just output to memo I do not use console
    AnsiString s="";
    s=s+typeid(T).name() + "\n";
    s=s+" " + AnsiString( TT::ENUM ) + "\r\n";        // E2451 Undefined symbol 'ENUM'
    s=s+" " + AnsiString( TT::func() ) + "\r\n";      // E2451 Undefined symbol 'func'
    s=s+" " + AnsiString( tt.ENUM ) + "\r\n";         // E2316 'ENUM' is not a member of 'traits<std::_Bvector>'
    s=s+" " + AnsiString( tt.func() ) + "\r\n";       // E2316 'func' is not a member of 'traits<std::_Bvector>'
    Form1->mm_log->Lines->Add(s);
    }
//---------------------------------------------------------------------------
// this is your main()
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner)
    {
    test< std::vector<char> >();
    test< std::vector<bool> >();
    }
//---------------------------------------------------------------------------
std::vector<char,std::allocator<char> >
 42
 42
 42
 42

std::vector<std::allocator<bool> >
 666
 666
 666
 666