template<typename T, T Min>
class LowerBoundedType {};
template<typename T> class vectorelement {};
template<> class vectorelement<Categorical> { typedef LowerBoundedType<double, 0.0> type; };
有错误:
error: 'double' is not a valid type for a template constant par
在这个27:35的中,Bryce Lelbach给出了以下示例:
template<auto... Dims>
struct dimensions {};
struct dynamic_extent {};
constexpr dynamic_extent dyn = {};
dimensions<64, dyn, 32> d;
此代码不编译。GCC抱怨说:
<source>:8:27: error: 'struct dynamic_extent' is not a valid type for a template non-type p
应用程序可以获得内存中对象的地址表示形式。
std::cout << &obj << std::endl
我试着用指针到成员类型来做同样的事情。
#include <iostream>
using namespace std;
struct X
{
bool b;
int a;
};
int X::* a =&X::a;
bool X::* b = &X::b;
X x;
int main()
{
cout << a << endl << b; //1
我从许多其他堆栈溢出线程(如)中了解到,模板参数是在编译时计算的。此外,非类型模板参数应该是一个常量表达式、积分表达式或指向具有外部链接的对象的指针。
而且,我在Makefile中的g++命令中没有使用--std=c++0x。
那么,是否可以实例化作为参数传递为NULL的模板类?
// I have a template class like this -
template<class T, T invalidVal, int e> class A
{
static inline bool dummy(T value)
{
return 0;
如果我创建了一个指向基成员的指针,我通常可以将它转换为指向派生成员的指针,但当在下面的Buzz这样的模板中使用时就不能了,因为第一个模板参数会影响第二个模板参数。我是在与编译器bug作斗争,还是标准真的要求这样做不起作用?
struct Foo
{
int x;
};
struct Bar : public Foo
{
};
template<class T, int T::* z>
struct Buzz
{
};
static int Bar::* const workaround = &Foo::x;
int main()
{
// This
考虑到这一点:
#include <set>
template <typename T, T val>
class sample {
public:
// Return val for new elements.
T& at(unsigned i) {
auto o = _set.insert(val);
return *o.first;
}
private:
std::set<T> _set;
};
class s {
public:
constexpr s() = defa
据我所知,基本类型是标量类型,数组是聚合类型,但是用户定义的类型呢?我根据什么标准将它们分为两类?
struct S { int i; int j };
class C { public: S s1_; S s2_ };
std::vector<int> V;
std::vector<int> *pV = &v;
让:
class A
{
typedef A (* func_t)( A a );
func_t * _func;
};
我必须按照什么顺序写这个,我需要什么前向声明(如果有的话),这样它才能编译?
这是我真正的代码,如果需要的话:
class Value
{
public:
typedef Value (* func_t)( const std::vector< Value > & args );
private:
union
{
/// ...
func_t * _f;
}
_data;
当我想在符号(::).It总是有一个尾随空格后获得宏中函数的地址时,就会产生这个问题,它会报告一个错误。
我在Mojave i386中使用了G++。
例如,我有一个类:
struct A{
void b();
};
还有一个宏:
#define ACC(name) &A::name
我用它来获取A::b的指针
void(*accab)() = ACC(b);
我会得到这样的错误:
error: cannot initialize a variable of type 'void (*)()' with an rvalue of type 'void (A::
我认为C++规范说在引用函数时,函数前面的符号是不必要的,即
void bar();
void foo(void(*bar)());
foo(bar);
foo(&bar); // Same as above.
然而,我发现了一个不正确的例子。我试图对lambda进行模板专门化(仅针对单个参数),以便能够访问lambda的返回参数和输入参数的类型。
// The ampersand in front of 'Fn::operator()' is necessary to make
// this code work.
template <typename La
我试图从成员函数进行一些回调,一切都很好,直到我尝试使用一个从2个类派生的模板类作为回调对象时,我得到了以下错误:
error C2440: 'reinterpret_cast' : Pointers to members have different representations; cannot cast between them
这件事告诉我成员函数指针有不同的表示(doh!)
这些表示是什么?它们之间的区别是什么?
GCC 8.2.1和MSVC 19.20编译了下面的代码,但Clang 8.0.0和ICC 19.0.1没有这样做。
// Base class.
struct Base {};
// Data class.
struct Data { int foo; };
// Derived class.
struct Derived : Base, Data { int bar; };
// Main function.
int main()
{
constexpr int Data::* data_p{ &Data::foo };
constexpr int Derived::
请验证我对指向成员的指针的理解是否正确。下面是一个示例类:
class T
{
public:
int *p;
int arr[10];
};
对于“标准”指针,下面的选项很常见:
int a = 1;
int *p1 = &a;
int *p2 = p1 (other notation: int *p2 = &*p1);
//The pointer p2 points to the same memory location as p1.
不可能对指向成员的指针执行上述操作:
int T::*pM = &(*T::p); // error
指
最近,我遇到了一个有趣的enable_if用法版本,可以有条件地启用一个可读性稍好的函数,因为该函数的返回类型不是enable_if的一部分(参见cleaner_usage):
#include <type_traits>
using maybe_integral = int /* = or float -- then won't compile */;
using return_type = int;
typename std::enable_if<std::is_integral<maybe_integral>::value, return_typ