// 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
中的第二行仍在编译?
谢谢
答案 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 ++的参数转换(例如double
到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
实现。