"cannot begin a template-argument list"対策

ubuntu上のswig-1.3.40でpythonモジュールをコンパイルしようとして遭遇。

どういうエラーかというとswigで自動生成したc++ソースで

std::vector<::meshio::la::Vector3,std::allocator< meshio::la::Vector3 > >

こういうソースが生成されていて、"

distutilsに介入して 文字列置換する

swigの呼び出しは、setup.pyから自動化されている。その中に"

    import re
    pattern=re.compile("<:")
    def edit(f):
        """
       引数のファイルの"<:"を"< :"に置換して、
        新ファイルに書き込む。新ファイル名を返す。
        """
        new_file=f+".cpp"
        io=open(new_file, 'wb')
        for line in open(f):
            if sys.version_info[0]<3:
                io.write(pattern.sub("< :", line))
            else:
                io.write(pattern.sub("< :", line).encode('utf-8'))
        io.close()
        return new_file

    #  class  build_extのswig_sourcesメソッドを改造 
    org=distutils.command.build_ext.build_ext.swig_sources
    def custom(self, sources, extension):
        # オリジナルの呼び出し後に結果のファイルを置換したファイルを作成。置換したファイル名を返す
        return [edit(f) for f in org(self, sources, extension)]
    distutils.command.build_ext.build_ext.swig_sources=custom

要するに既存のメソッドをオレオレメソッドで置き換えている。