草庐IT

commentable_type

全部标签

c++ - 没有 typedef 的运算符 member_function_pointer_type()?

是否可以在不使用typedef的情况下创建一个operatormember_function_pointer_type()(即通过内联指定成员函数指针的类型)?例如,在实现SafeBoolIdiom时:classFoo{typedefvoid(Foo::*bool_type)()const;public:operatorbool_type()const;};是否可以在声明运算符时直接写出bool_type的类型?如果是,怎么办? 最佳答案 这似乎是唯一不能在不使用typedef的情况下声明(类型转换)operator的情况。如果它是

C++ 模板参数和偏特化 : strong or weak typing?

今天,我和我的一个friend在一个愚蠢的错误上苦苦挣扎,我想知道模板参数在C++中是如何工作的。考虑以下代码,我在其中尝试部分特化类attr>其中I是一个unsignedint,虽然MyClass期望一个int参数:#includetemplateclassMyClass{};templatestructattr;templatestructattr>{};intmain(intargc,char*argv[]){attr>att;return0;}g++失败并显示错误消息main.cpp:Infunction‘intmain(int,char**)’:main.cpp:20:22:

c++ - `unique_lock`、 `scoped_lock` 和 `lock_guard` 中指定的 mutex_type 的用例是什么?

用于保护std::mutex的c++11mutexRAII类型都有一个typedef:typedefMutexmutex_type;std::lock_guard::mutex_typestd::unique_lock::mutex_typestd::scoped_lock::mutex_type这个成员typedef有什么意义?起初我认为它可以用来概括创建一个对象来移动锁(在unique_lock的情况下)例如:templatevoidfunction(SomeLockin)SomeLock::mutex_typenewMutex;//Dosomething但我无法想象它的用途。需要

c++ - boost::multi_index_container::index<Tag>::type 有什么意义?

如果你有一个boost::multi_index_container对于多个索引,显然有多种方法可以对其进行迭代——每个索引都定义了一种方法。例如,如果您有一个标签为T的索引,您可以从container.get().begin()迭代至container.get().end().如果您尝试在for循环中这样做(并且没有C++0xauto),迭代器的类型是multi_index_container::index::type::iterator.现在index::type将是boost::multi_index::detail::ordered_index或结构上等效的东西。例如。它将提供

c++ - 私有(private)转换函数导致 "ambiguous default type conversion"错误 (c++)

首先,一个演示问题的小例子:structBar{enumBaz{aa,bb,cc};Bazbaz_;operatorBaz()const{returnbaz_;}private:templateoperatorT()const;};intmain(){Barbar;switch(bar){caseBar::aa:break;caseBar::bb:break;caseBar::cc:break;default:break;}return0;}使用g++4.7.0编译此代码会出现以下错误:foo.cpp:Infunction‘intmain()’:foo.cpp:12:16:error:

c++ - 使用类型删除创建运行时 type_traits 查询

是否有可能使用类型删除来创建封装任意类型的对象(我们称之为ErasedType),并且可以在运行时查询以判断是否存在另一个任意类型T可转换为ErasedType?考虑之后,我不认为这是可能的-尽管看起来它在理论上可能是可能的。编译器会知道哪些类型T我们正在尝试与ErasedType进行比较,因此可以在运行前生成必要的代码。问题是,在实践中,似乎没有任何方法可以将模板参数类型从基类实例传递到子类实例。例如:structFooBase{templateboolis_convertible(){returncall_derived();}protected:virtualboolcall_d

c++ value_type 不适用于 std::map 中的 std::tr1:tuple

以下代码片段适用于VisualStudio2008,但不适用于VisualStudio2010。templatestructMyStruct{typedefstd::mapKeys;MyStruct(){}voidset(TKey&key){#if1//ThisworkswithVS2008butnotwith2010keys_.insert(typenameKeys::value_type(key,1));#else//ThisworkswithVS2008andVS2010keys_.insert(std::pair(key,1));#endif};private:Keyskeys

c++ - 干净地抑制 gcc 的 `final` 建议警告 (`-Wsuggest-final-types` 和 `-Wsuggest-final-methods` )

我喜欢使用-Wsuggest-final-types编译我的代码和-Wsuggest-final-methods以便在可能使用final关键字以允许编译器更积极地优化的机会时收到警告。不过,有时这些建议是不正确的-例如,我有一个类Base和一个virtual~Base()析构函数,在另一个项目中以多态方式使用,gcc建议我可以将Base标记为final。有没有办法“干净地”告诉编译器Base是多态使用的,不应该被标记为final?我能想到的唯一方法是使用#pragma指令,但我发现它会使代码困惑且难以阅读。理想情况下,我正在寻找可以添加到类/方法声明前/后的非最终关键字或属性。

c++ - MSVC 的 C4138 警告 ("' */' found outside of comment") 是否应该被禁用?

用msvc2017编译如下代码时voidFoo::bar(A*/*a*/)我收到这个警告:foo.cpp:38:warning:C4138:'*/'foundoutsideofcomment我可以通过在星号后添加一个空格来解决这个问题:voidFoo::bar(A*/*a*/)但是,我必须在很多地方执行此操作,如果我取消注释参数,由于额外的空间,我使用的编码风格将不会被遵循。由于我没有收到与gcc或clang相同的警告,我想知道这是否是可以安全禁用的特定于MSVC的怪癖。 最佳答案 是的,这是一个毫无根据的警告;您提供的代码没有任何

c++ - 错误 C2011 : 'MSXML2::IXMLDOMImplementation' : 'struct' type redefinition

我正在更改我的C++项目,该项目之前在VC6中,现在正在迁移到VS2008,以使用MSXML6而不是早期的MSXML3。当代码在VC6中时,我们通过导入它来使用MSXML3#import"msxml3.dll"这被替换为#import"msxml6.dll"在此之后,当我编译项目时,我得到了这个和其他几个类似的错误错误C2011:“MSXML2::IXMLDOMImplementation”:“结构”类型重新定义以上错误在msxml3.tlh文件中。1)为什么仍然使用msxml3?2)我将问题缩小到MSXML.h,它以某种方式自动包含在我的项目中。为什么是这样?3)MSXML.h中引用