g ++(带-fno-implicit-templates)从哪里获取模板定义,如果我没有明确地实例化它们?

时间:2011-10-28 15:42:03

标签: c++ templates g++

以下代码有效。

/* hello.cc */

#include <iostream>
#include <vector>

void vec_print()
{
    std::vector<int> is(10, 1);

    for (size_t i = 0; i < is.size(); ++i)
        std::cout << is[i] << " ";
    std::cout << std::endl;
}

/* main.cc */

void vec_print();

int main()
{
    vec_print();
}

当我用

编译时
g++ -fno-implicit-templates -Wall -Wextra -c hello.cc
g++ -fno-implicit-templates -Wall -Wextra -c main.cc
g++ hello.o main.o -o hello

我没有收到任何警告,它编译并运行正常。我认为这不应该发生。我正在使用gcc 4.4.5。

2 个答案:

答案 0 :(得分:6)

该选项不会阻止所有模板实例化,只是非内联实例:

  

-fno隐模板   永远不要为隐式实例化的非内联模板发出代码(即通过使用);只发出显式实例化的代码。有关详细信息,请参阅模板实例化。

编译器内联代码中使用的所有vector成员函数,因此编译成功。

使用该选项编译时,以下内容将失败,因为它需要非内联实例化:

#include <vector>

int main()
{
    auto f = &std::vector<int>::resize;
}

答案 1 :(得分:1)

根据联系方式:

   -fno-implicit-templates
       Never emit code for non-inline templates which are instantiated implicitly (i.e. by use); only emit code for explicit instantiations.

现在,在您的示例中,您将实例化类型,然后在类模板定义中调用 defined 的方法,因此隐式inline

你可以试试这个:

template <typename T>
void noop( T const & ) {}
int main() {
   noop(1);
}

然后使用g ++ -fno-implicit-templates -o test test.cpp

进行编译