小编She*_*win的帖子

为什么编译器抱怨f()不可见?

#include <iostream>

using namespace std;

template <size_t N>
typename enable_if<(N > 1), void>::type f(){
    cout << N - 1 << ' ';
    f<N - 1>();
}
template <size_t N>
typename enable_if<N == 1, void> ::type f() {
    cout << 1;
}
int main() {
    f<4>();
}
Run Code Online (Sandbox Code Playgroud)

编译器在第8行抱怨:

f< N - 1 >();
Run Code Online (Sandbox Code Playgroud)

调用f在模板定义中既未显示也未找到的函数ADL.

c++ templates c++11

8
推荐指数
2
解决办法
766
查看次数

函数指针从std :: function :: target <>()和普通函数指针之间的区别是什么?

以下代码是从APUE复制的信号实现,稍作修改

namespace
{
    using signal_handler = void (*)(int);
    signal_handler signal(sigset_t sig, signal_handler);
}

Signal::signal_handler Signal::signal(sigset_t sig, void (*handler)(int)) 
{
    struct sigaction newAction, oldAction;

    sigemptyset(&newAction.sa_mask);
    newAction.sa_flags = 0;
    newAction.sa_handler = handler;

    if (sig == SIGALRM) 
    {
#ifdef SA_INTERRUPT
        newAction.sa_flags |= SA_INTERRUPT;
#endif
    }
    else 
    {
        newAction.sa_flags |= SA_RESTART;
    }

    if (sigaction(sig, &newAction, &oldAction) < 0)
        throw std::runtime_error("signal error: cannot set a new signal handler.")

    return oldAction.sa_handler;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在我的测试中运行正常,但我想让它更像C++代码,所以我将signal_handler别名更改为

using signal_handler = std::function<void (int)>;
Run Code Online (Sandbox Code Playgroud)

我也用

newAction.sa_handler = handler.target<void (int)>();
Run Code Online (Sandbox Code Playgroud)

取代 …

c++ xcode

8
推荐指数
1
解决办法
196
查看次数

如何在swift中进行多重继承?

我需要实现一个派生的类(为了便利名称A)UITableViewController和另一个派生的(B)UICollectionViewController.并且有很多常见的东西,所以我想把它们放在类(C)中让A和B继承C.现在A和B都有两个继承类,但是swift中不允许多重继承,所以如何实现这个?我知道swift中不允许多重继承,但我仍然想知道如何做我上面描述的事情.

ios swift

8
推荐指数
3
解决办法
2万
查看次数

为什么编译器说:'enable_if'不能用于禁用此声明

template <bool Cond, typename Type = void>
using Enable_if = typename std::enable_if<Cond, Type>::type;

class Degree;

template <typename T>
constexpr inline bool Is_Degree() {
    return std::is_base_of<Degree, T>::value;
}

class Degree {
public:
    std::size_t inDeg = 0;
};

template <typename Satellite = Degree>
class Vertex: public Satellite {
public:
    explicit Vertex(int num): n(num) {}
private:
    std::size_t n;
};

template <typename Satellite = Degree>
class Edge {
public:
    // i want have different constructor depending on 
    // whether Vertex is (directly or indirectly) …
Run Code Online (Sandbox Code Playgroud)

c++ enable-if

6
推荐指数
1
解决办法
1468
查看次数

openat如何避免TOCTTOU错误?

根据UNIX环境中的高级编程,openat()提供了一种避免使用时间检查(TOCTTOU)错误的方法.

我对如何感到困惑.据我所知,openat依赖于文件描述符,所以需要首先打开这个文件描述符 - 这会引入TOCTTOU吗?

unix

6
推荐指数
1
解决办法
561
查看次数

为什么我的Mac上有两个uid为0的用户?

当我在终端中执行以下代码时:

dscl . -list /Users UniqueID
Run Code Online (Sandbox Code Playgroud)

输出显示两个用户使用uid 0:一个名为root,另一个名为newuser.

但是当我执行时:

cat /etc/passwd
Run Code Online (Sandbox Code Playgroud)

只有一个用户使用uid 0,即root.

我想知道为什么上述命令的答案不同,以及如何删除newuser.

我使用的是最新版本的Mac OS X.

当我未能安装parallels桌面试用版时,我发现了这个问题.错误消息是:

  1. 无法安装Parallels Desktop,因为您的系统中存在UID为0的非root用户帐户(http://kb.parallels.com/cn/122763)

我已经给苹果支持寻求帮助,但他们没有解决方案.

更新:

它 ![在此处输入图像说明

似乎newuser运行root应该运行的进程.此外,该ps命令也由newuser运行,但我的用户名是xlnwel

究竟什么是这个NEWUSER

更新2:

在此输入图像描述

我不知道我昨天做了什么(可能只是重新启动计算机),但今天这些进程是由root运行的.但是当我运行时仍然有两个用户为0:

dscl . -list /Users UniqueID

macos terminal

5
推荐指数
1
解决办法
1939
查看次数

我们应该在C++中使用exit吗?

根据C++参考

exit 正常终止进程,执行常规清理以终止程序.

正常程序终止执行以下操作(按相同顺序):销毁与具有线程存储持续时间的当前线程相关联的对象(仅限C++ 11).具有静态存储持续时间的对象被销毁(C++)并且使用atexit注册的函数被调用.所有C流(使用函数打开)都会关闭(并刷新,如果已缓冲),并且删除了使用tmpfile创建的所有文件.控制权返回给主机环境.

请注意,调用exit(C++)不会破坏具有自动存储的对象.

据我所知,当进程终止时,进程使用的所有存储都将被回收,那么自动存储对象的影响是什么?

c++ exit c++11

5
推荐指数
2
解决办法
407
查看次数

以下代码之间有什么区别,为什么一个有效,另一个无效?

我想定义一个函数,其行为取决于它的参数是否是pod类型,我这样做有两种方式:

第一

template <typename T, typename = typename std::enable_if<std::is_pod<T>::value>::type>
void f(const T&) {
    //...
}
template <typename T, typename = typename std::enable_if<!std::is_pod<T>::value>::type>>
void f(const T&) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

第二

template <typename T>
typename std::enable_if<std::is_pod<T>::value>::type f(const T&) {
    //...
}
template <typename T>
typename std::enable_if<!std::is_pod<T>::value>::type f(const T&) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

第二个很好,而第一个是错误.编译器抱怨在第一种情况下重新定义f.我想知道他们之间的区别.为什么第一个是错误.

谢谢你的阅读,请帮助我!

c++ templates enable-if

4
推荐指数
1
解决办法
122
查看次数

为什么编译器抱怨无法使用类型为Base的rvalue初始化"Derived"

class Base {
public:
    virtual Base* clone() const { return new Base(*this); }
    // ...
};
class Derived: public Base {
public:
    Derived* clone() const override { return new Derived(*this); }
    // ...
};
int main() {
    Derived *d = new Derived;
    Base *b = d;
    Derived *d2 = b->clone();
    delete d;
    delete d2;
}
Run Code Online (Sandbox Code Playgroud)

我在最新版本的Xcode中编译上面的代码,编译器抱怨

cannot initialize a variable of type "Derived*" with an rvalue of type "Base*"*
Run Code Online (Sandbox Code Playgroud)

Derived *d2 = b->clone().

但我已经克隆了,virtual并让clone()Derived返回 …

c++ derived-class

1
推荐指数
1
解决办法
946
查看次数

标签 统计

c++ ×6

c++11 ×2

enable-if ×2

templates ×2

derived-class ×1

exit ×1

ios ×1

macos ×1

swift ×1

terminal ×1

unix ×1

xcode ×1