模板专业化函数c ++

时间:2015-06-12 16:13:16

标签: c++ templates cout

这是我的代码:

#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

有人可以帮我理解哪两条线来自哪里?

2 个答案:

答案 0 :(得分:5)

您可能会收到编译器警告(至少)告诉您模板分别返回Tint,但您没有提供返回值,这是未定义的行为。您应该返回函数声明的类型。

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