Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正常函数不覆盖模板函数_C++_Templates_Overloading_Explicit Specialization - Fatal编程技术网

C++ 正常函数不覆盖模板函数

C++ 正常函数不覆盖模板函数,c++,templates,overloading,explicit-specialization,C++,Templates,Overloading,Explicit Specialization,我必须使用一个外部库,但是如果用std::string调用它,我会从下面的模板函数及其显式专门化中得到一个“多定义错误” template <typename T> void foo(T& value); template <> void foo(std::string& value); 问题是一样的 根据[1],至少不带模板的版本(“普通旧功能”)应优先于模板版本 有人知道问题出在哪里吗 [1] 您正在违反“一个定义”规则 除非函数是内联的,否则只能

我必须使用一个外部库,但是如果用std::string调用它,我会从下面的模板函数及其显式专门化中得到一个“多定义错误”

template <typename T>
void foo(T& value);

template <>
void foo(std::string& value);
问题是一样的

根据[1],至少不带模板的版本(“普通旧功能”)应优先于模板版本

有人知道问题出在哪里吗


[1]

您正在违反“一个定义”规则

除非函数是内联的,否则只能定义一次。如果将函数标记为
内联
,只要定义匹配,就可以根据需要经常定义它们。模板函数的行为就好像它们是隐式的
内联的
,所以模板不会出错

但是,显式专门化或非模板函数不是隐式的
内联的
,因为您将其包含在多个翻译单元中,所以可以得到多个定义;这违反了规则。您应该将其标记为
inline

template <>
inline void foo(std::string& value);
模板
内联void foo(标准::字符串和值);

(如果您在链接时间之前收到此消息,则需要包含防护装置。)

错误是在编译或链接时?此外,可能头文件没有得到宏的很好保护,只能包含一次。头文件中是否只有函数定义?你需要整个身体。请看这里:谢谢各位,GMan的回答起到了作用。请注意,以供将来参考:$14.7.3/14-“函数模板的显式专门化只有在显式声明为时才是内联的,并且与它的函数模板是否是内联的无关。”请告诉我们有关“模板函数隐式内联”的参考信息好吗?您是否还希望在您的回复中将“模板函数”更改为“函数模板”,并将“专门化”更改为“显式专门化”?已经+1'ed8.1.2的“C++模板”(),提到“模板通常有外部链接。唯一的例外是带有静态说明符的命名空间作用域函数模板:@Chubsdad:我说得太松散了。它们不是
内联的
,它们只是行为类似(编译器和/或链接器需要足够智能,就像只实例化一次一样)。
template <>
inline void foo(std::string& value);