【发布时间】:2013-09-02 04:06:25
【问题描述】:
我希望第一个代码示例的最后两行打印相同。
类型按我预期扣除,重载决议也如我预期。 但是,如果我明确地键入限定函数调用,那么我得到的结果与推断类型时不同。
第二个代码示例重复了用特化替换重载解析的练习。在这种情况下,一切都会按预期进行。
有什么解释吗?
编辑:我又添加了一行,显示 Karthik 提到的关于 print<R,int>(r); 的内容,我也不明白。
代码示例1:(函数模板重载)
#include <iostream>
template <typename T>
void print (T i)
{
std::cout << "simple" << std::endl;
}
template <template<typename> class FF, typename TT>
void print (FF<TT> i)
{
std::cout << "template" << std::endl;
}
template <typename T1, typename T2>
void print (T1 a)
{
T2 b;
std::cout << "two type parameters" << std::endl;
}
template <>
void print<int>(int i)
{
std::cout << "int" << std::endl;
}
template <typename T>
struct R
{
T x;
};
int main()
{
R<int> r;
print<int>(1.1); // ok, prints "int"
print(1.1); // ok, prints "simple"
print<int>(1); // ok, prints "int"
print(1); // ok, prints "int"
print(r); // ok, prints "template"
print<int,int>(1); // ok, prints "two type parameters"
print<R<int>,int>(r); // ok, prints "two type parameters"
print<R<int> >(r); // (1) ?? why "simple" ??
print<R,int >(r); // (2) ?? prints "template", why does it compile at all ??
// gcc 4.6.2 (-std=c++0x) and 4.8.1 (-std=c++11)
// clang++ 3.3.1 same behavior as gcc
}
代码示例 2:(类模板特化)。
#include <iostream>
template <typename T>
struct P
{
static void print (T i)
{
std::cout << "simple" << std::endl;
}
};
template <template<class TT> class FF, typename TT>
struct P <FF<TT> >
{
static void print (FF<TT> i)
{
std::cout << "template" << std::endl;
}
};
template <>
struct P<int>
{
static void print(int i)
{
std::cout << "int" << std::endl;
}
};
template <typename T>
struct R
{
T x;
};
int main()
{
R<int> r;
P<double>::print(1.1); // ok, prints "simple"
P<int>::print(1); // ok, prints "int"
P<R<int> >::print(r); // ok, prints "template"
//P<R,int >::print(r); // ok, does not compile
}
【问题讨论】:
-
你可以试试
print<R, int> -
是的,这行得通,我认为这是一个很好的提示。但此刻我还是不明白。
-
我认为你的最后一句话传递了一种类型,而你的“模板”模板需要
<R,int>表示法。可能这就是类型推断的推断和传递方式 -
等等,你说
print<R, int>(r);工作和打印template?这让我很困惑。为什么会这样做? -
@anthropomorphic output
标签: c++ overload-resolution template-templates