小编pte*_*gon的帖子

为什么允许嵌套类模板的部分特化,而完全不允许?

    template<int x> struct A {                                                                                                    
        template<int y> struct B {};.                                                                                             
        template<int y, int unused> struct C {};                                                                                  
    };                                                                                                                            

    template<int x> template<> 
    struct A<x>::B<x> {}; // error: enclosing class templates are not explicitly specialized

    template<int x> template<int unused> 
    struct A<x>::C<x, unused> {}; // ok
Run Code Online (Sandbox Code Playgroud)

那么,如果外部类也不是专用的,为什么不允许内部嵌套类(或函数)的显式特化?奇怪的是,如果我只是简单地添加一个虚拟模板参数来部分地专门化内部类,我可以解决这个问题.使事情更丑陋,更复杂,但它确实有效.

我会将完全特化视为部分特化的子集 - 特别是因为您可以通过添加伪参数将每个完整的特化表示为部分.因此,部分和完全专业化之间的消歧对我来说并没有多大意义.

不幸的是,没有人在comp.std.c ++敢于回答,所以我再次以赏金把它放在这里.

注意:我需要此功能用于一组外部类的内部类的递归模板,而内部参数的特化确实取决于外部模板参数.

c++ templates metaprogramming

42
推荐指数
3
解决办法
6677
查看次数

Python 3 networkx draw_graphviz()不起作用

我只想用Python 3 networkx和graphviz绘制一个简单的图形:

import networkx as nx

G = nx.complete_graph(3)
nx.draw_graphviz(G)
Run Code Online (Sandbox Code Playgroud)

我正在使用ubuntu14.04和IPython3,像往常一样我做了pip3安装networkx并运行代码给了我:

ImportError: pydot could not be loaded: http://code.google.com/p/pydot/
Run Code Online (Sandbox Code Playgroud)

我尝试安装pydotplus并运行代码:

/usr/local/lib/python3.4/dist-packages/networkx/drawing/nx_pydot.py in pydot_layout(G, prog, root, **kwds)
    294 
    295         if isinstance(node,list):
--> 296             node=node[0]
    297         pos=node.get_pos()[1:-1] # strip leading and trailing double quotes
    298         if pos != None:

IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)

和pydot2还:

/usr/local/lib/python3.4/dist-packages/pydot.py in write(self, path, prog, format)
   1893             prog = self.prog
   1894 
-> 1895         dot_fd = file(path, "w+b")
   1896         if format == 'raw':
   1897             data = self.to_string() …
Run Code Online (Sandbox Code Playgroud)

graphviz networkx python-3.x

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

配置时找到了 CMake 导入的目标,但生成了 build.make 说 target-NOTFOUND

我有一个简单的共享库,libfool2.so其中安装了fool2.h不是来自 CMake 项目的标头。我的项目my_temp1取决于fool2所以我写了一个FindFool2.cmake来制作一个导入的目标:

find_path(Fool2_INCLUDE_DIR fool2.h PATH_SUFFIXES fool2)
find_library(Fool2_LIB fool2)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Fool2
    REQUIRED_VARS Fool2_INCLUDE_DIR Fool2_LIB
)

if(Fool2_FOUND AND NOT TARGET Fool2::Fool2)
    add_library(Fool2::Fool2 SHARED IMPORTED)
    set_target_properties(Fool2::Fool2 PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${Fool2_INCLUDE_DIR}"
        INTERFACE_LINK_LIBRARIES "${Fool2_LIB}"
    )
endif()
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txtmy_temp1项目是:

cmake_minimum_required(VERSION 3.3)
project(my_temp1)

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake/cmake_modules) 
# FindFool2.cmake is in ${CMAKE_CURRENT_LIST_DIR}/cmake/cmake_modules

find_package(Fool2 REQUIRED)

if (TARGET Fool2::Fool2)
    message(STATUS "target found")
endif()

add_executable(my_temp1 main.cpp)
target_link_libraries(my_temp1 Fool2::Fool2)
Run Code Online (Sandbox Code Playgroud)

现在

$ tree ../__install
../__install/
??? include
?   ??? fool2 …
Run Code Online (Sandbox Code Playgroud)

cmake

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