我有一个QMap对象,我正在尝试将其内容写入一个文件。 QMap<QString, QString> extensions; //.. for(auto e : extensions) { fout << e.first << "," << e.second << '\n'; } 为什么我会得到: error: 'class QString' has no member named 'first' nor 'second' 是不是typesQPair ?
我们在编译以下源代码时观察到一个奇怪的行为: template<template<class> class TT> struct X { }; template<class> struct Y { }; template<class T> using Z = Y<T>; int main() { X<Y> y; X<Z> z; z = y; // it fails here } 这是一个从模板别名的c ++ 11标准提案中稍作修改的例子: http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf (请参阅第4页)还要注意,提案“声明y和z是同一types”。 因此,在我们的解释中,应该可以从y分配(或复制构造)z。 但是,这个代码不能用gcc 4.8.1和clang 3.3编译。 这是编译器中的错误还是我们误解了标准? 在此先感谢,craffael等;) PS Clang错误信息是: error: no viable overloaded '=' note: […]
在对这篇文章的回答“ (部分地)专门化非依赖types的非types模板参数 ”中,它指出: 对应于专门的非types参数的模板参数的types不应该依赖于专门化的参数。 [例如: template <class T, T t> struct C {}; template <class T> struct C<T, 1>; // error template< int X, int (*array_ptr)[X] > class A {}; int array[5]; template< int X > class A<X,&array> { }; // error – 例子] 我的问题是为什么这个限制在这里? 至less有一个用例,我发现这个限制干扰了编写干净的代码。 例如 template <typename T, T*> struct test; template <typename […]
当编译器试图parsingi.template hi<T>(); 它发现hi在全球命名空间,而不是在i ( ideone )的方法hi 。 为什么? #include <cstdio> // Define 'hi' and 'bye' in the global namespace; these should *not* be used template<typename T> struct hi { }; template<typename T> struct bye { }; // Foo needs to be templated for Foo::Inner to be a dependent type (I think) template<typename T> struct Foo […]
想像: S f(S a) { return a; } 为什么不允许别名和返回值插槽? S s = f(t); S s = t; // can't generally transform it to this 🙁 如果S的拷贝构造函数有副作用,spec不允许这个转换。 相反,它需要至less两个副本(一个从t到a ,一个从a到返回值,另一个从返回值到s ,只有最后一个可以被忽略。代表t到f的拷贝的事实,唯一的拷贝在移动/拷贝构造函数的副作用的存在下仍然是强制性的)。 这是为什么?
我可以使用模板别名作为模板模板参数吗? template <template <typename…> class> struct foo {}; template <typename T> using simple_ptr = std::unique_ptr<T>; foo<std::unique_ptr> a; // this doesn't work, std::unique_ptr has two parameters foo<simple_ptr> b; // does this work?
如果我有一个类定义类似 class A { protected: ~A(){ } }; 那么我可以dynamic地分配个人以及对象的数组 A* ptr1 = new A; A* ptr2 = new A[10]; 但是,当我定义这个类的构造函数 class A { public: A(){} protected: ~A(){ } }; 那么我可以创build个人对象 A* ptr = new A; 但是当我尝试dynamic分配对象的数组 A* ptr = new A[10]; 编译器(gcc-5.1和Visual Studio 2015)开始抱怨A ::〜A()是不可访问的。 任何人都可以解释一下: 1-为什么在构造函数被定义和未定义的行为的差异。 2-当构造函数被定义为什么我被允许创build单个对象而不是对象数组。
考虑这个代码: #include <memory> #include <iostream> class A { public: A(int data) : data_(data) { std::cout << "A(" << data_ << ")" << std::endl; } ~A() { std::cout << "~A()" << std::endl; } void a() { std::cout << data_ << std::endl; } private: int data_; }; class B { public: B(): a_(new A(13)) { std::cout << […]
它在这里和这里说的typeslong long至less和int一样长,并且不less于64位 。 我一直在看C ++ 11标准§3.9.1基本types部分,我找不到任何对64位的引用。 我所能find的是,至less在long int ,至less和int一样长。 该标准列出了long long的标准整数types,而不是一个扩展的types,所以我想知道是否这个long long持有至less64位的断言是真实的。 如果是,它在哪里陈述? 请注意,我只是在谈论C ++ 11标准long long而已。
我有以下C ++ 11代码。 #include <type_traits> using IntType = unsigned long long; template <IntType N> struct Int {}; template <class T> struct is_int : std::false_type {}; template <long long N> struct is_int<Int<N>> : std::true_type {}; int main() { static_assert (is_int<Int<0>>::value, ""); return 0; } Clang ++ 3.3编译代码,但在g ++ 4.8.2静态断言失败 $ g++ -std=c++11 main.cpp main.cpp: In function […]