我正在编写一些代码,将 lambda 函数传递给一组递归函数。其中一些 lambda 函数嵌套在其他 lambda 函数内。我认为我正在编写有效的代码,但出现错误fatal error C1060: compiler is out of heap space。
这是代码的精简版本
struct Null
{
template <typename SK>
static void match(SK sk)
{
}
};
template <typename T>
struct Repetition
{
template <typename SK>
static void match(SK sk)
{ // <--------------------------------- error message points to this line
T::match([]() { match([]() {}); });
}
};
int main()
{
using Test = Repetition<Null>;
Test::match([](){});
}
Run Code Online (Sandbox Code Playgroud)
现在这个最小版本没有多大意义,但它有相同的编译器错误。我已经指出了上面错误的行。
我的问题是,这是编译器错误/限制还是我的代码在某种程度上无效?
编译器是 Visual Studio 2022 编译 C++20。
谢谢
我试图了解const double* const用作模板的内幕。我有一些非常基本的计算想要高效执行,但是我不知道c ++编译器是如何工作的(汇编代码是什么)。
这个想法是为一个函数创建一个模板,该函数将3个常量double用作模板参数,并将double用作参数。
constexpr double p1 = 1;
constexpr double p2 = 2;
constexpr double p3 = 3;
template <const double* const a,
const double* const b,
const double* const c>
inline double func(double value)
{
constexpr double d = *a - *b;
constexpr double e = *a - *c;
constexpr double ratio = d / e;
constexpr double remain = *c - *a * ratio;
return value * ratio + remain;
}
double func2(double c) …Run Code Online (Sandbox Code Playgroud) 我有以下程序
#include <iostream>
class Blah {
private:
void hello();
public:
Blah();
};
void Blah::hello() {
std::cout << "Hello, world" << std::endl;
}
Blah::Blah() {
hello();
}
int main() {
Blah a();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它编译得很好,但是当我运行它时,程序不会像我预期的那样在控制台中打印"Hello,world".为什么是这样?
如果我们使用构造函数,我们需要使用setter和getter.我对这些术语完全感到困惑,有人可以详细说明.
这似乎有效,它是一个宏,可以根据扩展的次数扩展到连续的整数.
;; Library (test macro-state)
(library
(test macro-state)
(export get-count incr-count)
(import (rnrs))
(define *count* 0)
(define (get-count) *count*)
(define (incr-count) (set! *count* (+ *count* 1)))
)
;; Program
(import (rnrs) (for (test macro-state) expand))
(define-syntax m
(lambda (x)
(syntax-case x ()
((m) (begin (incr-count) (datum->syntax #'m (get-count)))))))
(write (list (m) (m) (m)))
(newline)
;; prints (1 2 3)
Run Code Online (Sandbox Code Playgroud)
但它对我来说很笨拙,因为宏状态*count*和宏m本身在不同的模块中.有没有更好的方法在r6rs中执行此操作,最好是不将两个模块的实现分开?
编辑
我应该说清楚,尽管这个例子只是一个宏,但实际上我正在寻找一种在多个宏需要共享状态时有效的方法.
有些人声称这using namespace std;是不好的做法.其他人说这样就好了.但是每个人都同意将它放在头文件中是禁止的.
亲爱的读者,可以从Bjarne Stroustrup自己的网站上解释一下.
http://www.stroustrup.com/Programming/Graphics/std_lib_facilities.h
他甚至没有把它放在你可能注意到它的顶部,它大约有50行.
这里发生了什么?是恶作剧黑客通过在他的网站上放置不良代码来诋毁BS吗?
c++ ×5
c++11 ×1
coding-style ×1
constexpr ×1
double ×1
oop ×1
precompiled ×1
r6rs ×1
scheme ×1
templates ×1