如何将一组预定的模板实例添加到函数模板中

时间:2013-05-15 18:20:02

标签: c++

// hello.h
template<typename T>
bool comp( T first, T second )
{
    return first < second;
}

// hello.cpp
template bool comp(int, int); // would ONLY allow comp to access int

// main.cpp
std::cout << std::boolalpha << comp(10, 12) << std::endl;    // fine
std::cout << std::boolalpha << comp(2.2, 3.3) << std::endl;  // fine why!

问题1&gt;我似乎无法将comp的实施代码放在hello.cpp中。这是真的吗?

问题2&gt;我尝试将comp的输入参数限制为仅整数。为什么main.cpp中的第二行仍在编译?

谢谢

2 个答案:

答案 0 :(得分:1)

  

似乎我无法在hello.cpp中输入comp的实现代码。这是真的吗?

通常,是的;大多数模板需要在他们使用的每个翻译单元中定义,因此通常需要在标题中定义。

但是,看起来你正试图为一个(或某些类型)类型显式实例化它,而不允许其他类型。在这种情况下,您需要在标题中声明它:

// hello.h
template<typename T>
bool comp( T first, T second );

在源文件中定义并实例化它:

// hello.cpp
template<typename T>
bool comp( T first, T second )
{
    return first < second;
}

template bool comp(int, int);

并在包含标题的任何文件中使用实例化的特化:

// main.cpp
std::cout << std::boolalpha << comp(10, 12) << std::endl;    // fine
// std::cout << std::boolalpha << comp(2.2, 3.3) << std::endl;  // link error
  

为什么main.cpp中的第二行仍在编译?

在您的示例中,模板定义仍然可用(在标头中)以隐式实例化所需的任何特化。所以第二行为double实例化它并愉快地编译。将模板定义移动到单独的源文件中可以防止这种情况。

答案 1 :(得分:0)

这将实现comp,因此C ++的参数转换(例如doubleint)不会发生。

// hello.h
template<typename T>
bool comp( T first, T second );

// hello.cpp
template<>
bool comp( int first, int second )
{
    return first < second;
}

这使comp的一般形式没有定义。只存在特定的int实现。