以下代码有效。
/* 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。
答案 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
进行编译