据我所知,与公有继承时,通常不是安全时,由于delete荷兰国际集团一个基类指针编译器只生成的代码来调用基类的析构函数,并且派生类的一个不叫.
但是对于私有继承,客户端不能将派生类指针强制转换为基类指针(因为私有继承不建模is-a关系),所以delete总是在派生类的指针上使用,编译器应该能够看到那里也是一个基类并调用它的析构函数.
我做了这个测试:
#include <iostream>
struct BaseVirtual
{
virtual ~BaseVirtual()
{
std::cout << "BaseVirtual's dtor" << '\n';
}
};
struct BaseNonVirtual
{
~BaseNonVirtual()
{
std::cout << "BaseNonVirtual's dtor" << '\n';
}
};
struct DerivedPrivVirtual: private BaseVirtual
{
static void f()
{
BaseVirtual * p = new DerivedPrivVirtual;
delete p;
}
~DerivedPrivVirtual()
{
std::cout << "DerivedPrivVirtual's dtor" << '\n';
}
};
struct DerivedPrivNonVirtual: private BaseNonVirtual
{
static void f()
{
BaseNonVirtual * p …Run Code Online (Sandbox Code Playgroud) 我使用rubenvb的CLang构建在Windows上编译了Boost 1.51.0 .我实际上使用MinGW编译了b2:
bootstrap mingw
... compiling b2 using mingw...
Run Code Online (Sandbox Code Playgroud)
然后我用CLang编译了库:
b2 toolset=clang stage --stagedir=. --build-type=complete --with-regex ...
Run Code Online (Sandbox Code Playgroud)
顺便说一句,即使我指定--build-type=completelib目录中没有DLL,但我在某处读到了CLang在Windows上仍然存在链接问题,这可能是原因.无论如何静态库对我来说都没问题.我收到这些文件%BOOST_ROOT%\lib:
libboost_regex-clang31-1_51.lib
libboost_regex-clang31-d-1_51.lib
libboost_regex-clang31-mt-1_51.lib
libboost_regex-clang31-mt-d-1_51.lib
libboost_regex-clang31-mt-s-1_51.lib
libboost_regex-clang31-mt-sd-1_51.lib
libboost_regex-clang31-s-1_51.lib
libboost_regex-clang31-sd-1_51.lib
Run Code Online (Sandbox Code Playgroud)
现在,如果我从命令行编译CLang的东西一切正常.问题显示当我尝试让CMake找到Boost库时:它根本找不到它们.我试过这个CMakeFiles.txt:
cmake_minimum_required (VERSION 2.8)
project(ccc)
# Setting/unsetting this does not change anything.
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost COMPONENTS regex REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIRS})
add_executable(ccc main.cpp)
target_link_libraries(ccc
${Boost_REGEX_LIBRARY}
)
Run Code Online (Sandbox Code Playgroud)
使用MinGW(和Boost的MinGW编译版本)构建它可以工作.如果我铿锵尝试(有设置好的后CC=clang,CXX=clang++和BOOST_ROOT=C:/misc/boost/clang-1_51_0)不:
D:\Desktop\ppp>cmake -G "MinGW Makefiles" ..\ccc
-- The C compiler identification is Clang 3.1.0
-- The …Run Code Online (Sandbox Code Playgroud) 我试图解析一些文本,但我无法理解如何解析由某个分隔符分隔的符号列表,这些符号可能也可能不会出现在列表的末尾.
示例(以空格分隔的数字):
set A = 1 2 3 4 5;
set B =6 7 8 9;
set C = 10 11 12 ;
Run Code Online (Sandbox Code Playgroud)
如果我使用sepBy,在最后一个空格后我得到一个错误,因为它期望另一个数字,即使我也尝试many whitespace在列表之后读取.如果我使用endBy,当空格丢失时我收到错误.
import Text.ParserCombinators.Parsec
main :: IO ()
main = do
let input = "set A = 1 2 3 4 5;\n" ++
"set B =6 7 8 9;\n" ++
"set C = 10 11 12 ;\n"
case parse parseInput "(unknown)" input of
Left msg ->
print msg
Right rss -> …Run Code Online (Sandbox Code Playgroud) 我找到了一个用于在此页面上使用Haskell编写PNG文件的小型库.我只是重新排列它,以便它支持所有单色,灰度和RGB输出.
但是,在编写大型单色图像时,似乎总是会出现堆栈溢出,但如果使用灰度或RGB则不会.在这个例子中,大小阈值width大约是2000:如果我设置小于该值,则生成图像,否则我得到堆栈溢出.
import Png
import qualified Data.ByteString.Lazy as B
width = 2000 :: Int
main = do
let setG = [ [ (r + c) `mod` 256 | c <- [0..width]] | r <- [0..width]]
let outputG = pngGrayscale setG
putStrLn "Writing grayscale image..."
B.writeFile "grayscale.png" outputG
putStrLn "Done"
let setR = [ [ (r `mod` 256, c `mod` 256, (r+c) `mod` 256) | c <- [0..width]] | r <- [0..width]]
let outputR = pngRGB setR …Run Code Online (Sandbox Code Playgroud)