0
// 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> 好像我不能把实现代码comp放在hello.cpp. 真的吗?

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

谢谢

4

2 回答 2

1

看来我无法将 comp 的实现代码放入hello.cpp. 真的吗?

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

但是,您似乎正在尝试为一个(或一组)类型显式实例化它,而不允许其他类型使用它。在这种情况下,您需要在标头中声明它:

// 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并愉快地编译。将模板定义移动到单独的源文件中可以防止这种情况。

于 2013-05-15T18:34:27.257 回答
0

这将实现compC++ 的参数转换(如您的doubleto int)不会发生。

// 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实现才会存在。

于 2013-05-15T18:33:09.830 回答