我正在尝试用两种不同的功能调度我的电话。一个用于指针,另一个用于引用。但是一旦我使用 const 限定符,模板就不会按预期发送。在我的例子中,get_pixel
不使用任何 const 限定符,因为它应该编辑给定的参数。 set_pixel
应该使用给定的参数,但不要编辑它,我希望这些参数保持 const 。
#include <iostream>
template <typename Color>
inline int get_pixel(
Color& color)
{
return 1;
}
template <typename T>
inline int get_pixel(
T components[])
{
return 2;
}
template <typename Color>
inline int set_pixel(
const Color& color)
{
return 1;
}
template <typename T>
inline int set_pixel(
const T components[])
{
return 2;
}
template <typename Color>
inline int set_pixel_no_const(
Color& color)
{
return 1;
}
template <typename T>
inline int set_pixel_no_const(
T components[])
{
return 2;
}
int main()
{
float c;
float tab[1];
std::cout << "Get PIXEL\n";
std::cout << "Dispatch for c : " << get_pixel(c) << "\n"; // 1
std::cout << "Dispatch for &c : " << get_pixel(&c) << "\n"; // 2
std::cout << "Dispatch for tab : " << get_pixel(tab) << "\n"; // 2
std::cout << "Set PIXEL\n";
std::cout << "Dispatch for c : " << set_pixel(c) << "\n"; // 1
std::cout << "Dispatch for &c : " << set_pixel(&c) << "\n"; // 1, Should be 2
std::cout << "Dispatch for tab : " << set_pixel(tab) << "\n"; // 1, Should be 2
std::cout << "Set PIXEL NO CONST\n";
std::cout << "Dispatch for c : " << set_pixel_no_const(c) << "\n"; // 1
std::cout << "Dispatch for &c : " << set_pixel_no_const(&c) << "\n"; // 2
std::cout << "Dispatch for tab : " << set_pixel_no_const(tab) << "\n"; // 2
return 0;
}
知道为什么 const 限定符在这里有问题吗?
答案 0 :(得分:3)
模板推断不能用作文本替换,而是作为整体T
。
当T
中的const T
被推断为float*
时,您不会获得const float*
,而是float* const
。
或const (float*)
,如果我们有这样的语法。
答案 1 :(得分:2)
我可能错了,但我认为基本上这个问题归结为:
#include <iostream>
template <typename T>
int f(T const &)
{
//std::cout << __PRETTY_FUNCTION__ << "\n";
return 1;
}
template <typename T>
int f(T const *)
{
//std::cout << __PRETTY_FUNCTION__ << "\n";
return 2;
}
int main()
{
float c = 1.f;
float * addr = &c;
float const * addr_const = &c;
f(c); // 1
f(&c); // 1 you expected 2
f(addr); // 1 you expected 2
f(addr_const); // 2 as you expect
return 0;
}
你的const数组函数参数与函数声明中的const指针参数相同(所以我在这个例子中用这种方式)。
我认为第一个函数是基本模板,而第二个版本是更专业的版本(因为它只需要指向const T的指针)。因此,当您将指针传递给非const时,会选择const引用。除非在这种情况下你真的传递了一个指向const作为参数的指针。
如果您使用gcc(我认为),您可以使用__PRETTY_FUNCTION__
来显示推断出的参数