TMB教程中的这个编译错误是什么?

What is this compilation error in the TMB tutorial?

我从TMB复制了C++代码tutorial page

#include <TMB.hpp>                                // Links in the TMB libraries

template<class Type>
Type objective_function<Type>::operator() ()
{
    DATA_VECTOR(x);                                 // Data vector transmitted from R
    PARAMETER(mu);                                  // Parameter value transmitted from R
    PARAMETER(sigma);                               //                 

    Type f;                                         // Declare the "objective function" (neg. log. likelihood)
    f = -sum(dnorm(x,mu,sigma,true));               // Use R-style call to normal density

    return f;
}

并保存为tutorial.cpp。然后我尝试按照说明编译它并得到:

> compile("tutorial.cpp")
Error in compile("tutorial.cpp") : Compilation failed
In addition: Warning messages:
1: In readLines(file) : incomplete final line found on 'tutorial.cpp'
2: running command 'make -f ".../R/R-33~1.2/etc/x64/Makeconf" -f "C:/PROGRA~1/R/R-33~1.2/share/make/winshlib.mk" -f "...\AppData\Local\Temp\RtmpqgV7xA\file2d987ade32f3" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="tutorial.dll" WIN=64 TCLBIN=64 OBJECTS="tutorial.o"' had status 127 

此外,在 RStudio 编辑器中 window 我可以看到行 Type objective_function<... 旁边有一个十字,悬停在错误:

Variable templates are a C++1y extension
expected ';' at end of declaration
expected unqualified-id

我应该怎么做才能修复它以便教程函数可以编译?

Session 信息:

R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] TMB_1.7.8

loaded via a namespace (and not attached):
[1] Matrix_1.2-8     tools_3.3.2      grid_3.3.2    lattice_0.20-34 

我现在已经解决了我的问题,它分为两个部分。第一个是 Windows 中没有安装 Rtools。这是 mentioned here:

Why can I not build and run models in Windows, after installing TMB from CRAN? TMB on Windows requires Rtools. The PATH environment variable should point to the Rtools 'make' and 'gcc', and no other instances of 'make' or 'gcc'.

第二个问题是,在安装 Rtools 之后,我仍然找不到编译器,尽管已验证我可以从以下命令行使用它 these instructions:

In some cases this PATH might be C:\RBuildTools... Further, we can check if g++ can be really called from R. For example, we can see the version of gcc in R as follows.

> system('g++ -v')
Using built-in specs.
COLLECT_GCC=c:\Rtools\GCC-46~1.3\bin\G__~1.EXE
COLLECT_LTO_WRAPPER=c:/rtools/gcc-46~1.3/bin/../libexec/gcc/i686-w64-mingw32/4.6.3/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with: /data/gannet/ripley/Sources/mingw-test3/src/gcc/configure --host=i686-w64-mingw32 --build=x86_64-linux-gnu --target=i686-w64-mingw32 --with-sysroot=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/mingw32 --prefix=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/mingw32 --with-gmp=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/prereq_install --with-mpfr=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/prereq_install --with-mpc=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/prereq_install --disable-shared --enable-static --enable-targets=all --enable-languages=c,c++,fortran --enable-libgomp --enable-sjlj-exceptions --enable-fully-dynamic-string --disable-nls --disable-werror --enable-checking=release --disable-win32-registry --disable-rpath --disable-werror CFLAGS='-O2 -mtune=core2 -fomit-frame-pointer' LDFLAGS=
Thread model: win32
gcc version 4.6.3 20111208 (prerelease) (GCC)

> system('where make')
c:\Rtools\bin\make.exe

我收到的错误是:

> compile('tutorial.cpp')
c:/Rtools/mingw_64/bin/g++  
...
c:/Rtools/mingw_64/bin/g++: not found

这表明路径在某处被硬编码。按照 alternative gcc compilers 的使用说明,我发现该路径已硬编码在我的 Makeconf 文件中,该文件位于:"C:\Program Files\R\R-3.3.2\etc\x64\Makeconf"

然后我注释掉旧行并用正确的路径替换它:

# BINPREF ?= c:/Rtools/mingw_64/bin/
BINPREF ?= C:/RBuildTools/3.4/mingw_64/bin/

在此之后编译工作无需重新启动。