C++ bcc32:专门研究“std::vector”时出现奇怪错误<;布尔>`
当traits类专门用于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
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