草庐IT

C++重载优先于特化?

给定以下代码:#includeusingnamespacestd;templatevoidPrint(Tt){coutvoidPrint(intt){cout>c;return0;}为什么调用Print(2)没有歧义,而是调用voidPrint(inti)?ps:使用bcc64.exe和cl.exe测试。 最佳答案 标准的第13.3.3节,关于为重载选择最佳函数,明确指出如果在具有完全相同参数列表的模板函数和非模板函数之间进行选择,则非模板函数始终是比模板化的更适合。 关于C++重载优先

c++ - Android NDK pretty-print

我正在使用AndroidNDK和Eclipse+CDT,在OSX上运行。我希望能够调试STD库的内容。我看过一些关于使用Python脚本启用这种“pretty-print”的教程。问题是它们都使用默认的gdb,而不是AndroidNDK提供的gdb,所以它们对我来说都失败了。如何使用AndroidNDK调试STD库? 最佳答案 如果您只需要调试,而不是让一些已经选择的工具工作,我可以分享这段代码:dlog.h:#include#defineLOGD(...)__android_log_print(ANDROID_LOG_DEBUG,

C++ GCC 为什么这段 sfinae 代码可以用 GCC 4.7 编译,但不能用 4.8 编译?

我喜欢在模板类中使用本地类来执行类似“staticif”的构造。但是我遇到了gcc4.8不想编译我的代码的问题。但是4.7可以。这个例子:#include#include#includeusingnamespacestd;structA{voidprintA(){coutstructTest{voidprint(){structIfA{constexprIfA(T&value):value(value){}T&value;voidprint(){value.printA();}};structIfB{constexprIfB(T&value):value(value){}T&value

c++ - 即使没有子类重写一个方法,它也会被虚拟调用吗?

假设您有以下类:classA{public:virtualvoidprint(){printf("A\n");}};classB:publicA{public:virtualvoidprint()override{printf("B\n");}};classC:publicB{//nooverrideofprint};现在,如果您创建B的实例并调用print:B*b=newB;b->print();这个方法会被虚调用吗?换言之,具体调用的方法是在编译时还是运行时确定的?理论上它可以在编译时确定,因为我们知道,B的子类都不会覆盖该方法,所以无论我将什么分配给指向B的指针B*b=newC;

C++ 重载和覆盖

此代码生成以下编译错误:error:nomatchingfunctionforcallto'C::print(int)'你能帮我弄清楚编译器产生那个错误的过程吗,(为什么它忽略了类B中的函数)#includeusingstd::cout;classA{public:virtualvoidprint(){coutprint(5);} 最佳答案 print的每个后续定义都隐藏了其父级的定义。您需要一个using语句来取消隐藏它:classA{public:virtualvoidprint(){coutDemo您的指针指向C*,而不是B*

c++ - std::string 的 type_traits 段错误

从UsingSFINAEtocheckforglobaloperator收集信息和templates,decltypeandnon-classtypes,我得到了以下代码:http://ideone.com/sEQc87基本上,我将两个问题的代码结合起来,如果它有ostream声明,则调用print函数,否则调用to_string方法。摘自问题1namespacehas_insertion_operator_impl{typedefcharno;typedefcharyes[2];structany_t{templateany_t(Tconst&);};nooperatorstruct

c++ - 调用模板化方法的语法

我想知道调用模板方法的正确语法是什么:structprint_ch{print_ch(charconst&ch):m_ch(ch){}~print_ch(){}templatevoidoperator()(){std::cout(m_ch)我想出了这样的东西:print_chprinter('c');printer.operator()();它似乎可以工作(GCC4.5),但是当我在另一个模板化方法中使用它时,例如:structprinter{typedefintprint_type;templatestaticvoidprint(T_functor&fnct){fnct.operat

c++ - 如何专门针对特定类型的模板类方法?

我有这样的代码:classBar{public:voidprint(){std::coutclassFoo{public:template::value,T>::type>voidprint(){t.print();}templatevoidprint(){std::coutfoo1;Foofoo2;foo2.print();}这段代码的目的是:如果Tt是Bar或Bar的子类,然后foo.print()推导为voidprint(){t.print();},否则推导为voidprint(){std::cout,但事情并没有像我预期的那样工作。编译器错误:"anon-typetemplat

c++ - 函数调用中的单元素 vector 初始化

考虑以下示例代码:示例:voidprint(intn){coutvec){coutv={2};/*call3*/print(v);/*call4*/print(std::vector{2});return0;}生成以下输出:elementprintelementprintvectorprintvectorprint为什么对print函数的调用(上例中的调用2)与接受单个值的函数相匹配?我在这个调用中创建了一个vector(包含单个元素),所以它不应该匹配以vector作为输入调用print吗?这是部分讨论inanotherquestion其中提供的解决方案适用于具有1个以上元素的vec

c++ - 是否可以编写一个可以采用 n 维数组的函数?

我正在尝试编写一个函数,它可以获取任何维度的数组并成功打印数组中的值。但是我无法继续前进,因为我们必须在声明函数时声明除最左边的所有维度。有没有可能我们可以编写一个通用函数,它可以将数组作为任何维度的输入?例如,该函数应该能够采用2维数组或3维数组或n维数组,其中n是任意数字。 最佳答案 对每个维度和模板使用递归(在C++中也是如此),以下可能会有所帮助:templatevoidprint(constT&e){std::coutvoidprint(constT(&a)[N]){std::cout示例用法:inta[2][3][4];