这是我的代码:
#include <iostream>
using namespace std;
template< typename T >
T silnia( T w ) {
cout << "not special" << endl;
}
template<>
int silnia<int>( int x ) {
cout << "special" << endl;
}
int main() {
cout << silnia<double>(5) << endl;
cout << silnia<int>(5) << endl;
return 0;
}
这是输出:
not special
nan
special
4712544
有人可以帮我理解哪两条线来自哪里?
答案 0 :(得分:5)
您可能会收到编译器警告(至少)告诉您模板分别返回T
和int
,但您没有提供返回值,这是未定义的行为。您应该返回函数声明的类型。
template< typename T >
T silnia( T w ) {
cout << "not special" << endl;
return w;
}
template<>
int silnia<int>( int x ) {
cout << "special" << endl;
return x
}
为什么重要?因为您正在使用std::cout
来尝试输出这些函数调用的返回值。
cout << silnia<double>(5) << endl;
cout << silnia<int>(5) << endl;
答案 1 :(得分:4)
两个函数模板都有返回类型,但实现不会返回任何内容。您有未定义的行为,因为您尝试使用返回值。这与模板无关。
这是您的代码的固定版本:
#include <iostream>
using std::cout;
using std::endl;
template< typename T >
T silnia( T w ) {
cout << "not special" << endl;
return w;
}
template<>
int silnia<int>( int x ) {
cout << "special" << endl;
return x;
}
int main() {
cout << silnia<double>(5) << endl;
cout << silnia<int>(5) << endl;
}
输出
not special
5
special
5