带有void类型和参数的C++11模板专用化
C++11 template specialization with void type and argument
在C++11程序中,我定义了以下模板:
namespace outcome {
template <class T>
class c_out {
public:
bool success = false;
std::string error = "";
T result;
};
template <class T>
c_out<T> failed(T res, const std::string& error_msg = "") {
c_out<T> outcome;
outcome.success = false;
outcome.error = error_msg;
return outcome;
};
template <class T>
c_out<T> succeeded(T res) {
c_out<T> outcome;
outcome.success = true;
outcome.result = res;
return outcome;
};
};
当类T为void时,我想专门化它们。对于c_out:来说,它很容易实现
template <>
class c_out<void> {
public:
bool success = false;
std::string error = "";
};
然而,我在其他两个函数中不断出现错误。我怎样才能把它们专门化?
c_out<void> failed(const std::string& error_msg = "") {
c_out<void> outcome;
outcome.success = false;
outcome.error = error_msg;
return outcome;
};
c_out<void> succeeded(void) {
c_out<void> outcome;
outcome.success = true;
return outcome;
};
错误:当我调用时
outcome::succeeded();
在YYY.cpp中,我在链接库时出错:
lib/libXXX.a(YYY.cpp.o): In function `outcome::failed(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
YYY.cpp:(.text+0x0): multiple definition of `outcome::failed(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
CMakeFiles/ZZZ.dir/main/main.cpp.o:main.cpp:(.text+0x0): first defined here
lib/libXXX.a(YYY.cpp.o): In function `outcome::succeeded()':
YYY.cpp:(.text+0x50): multiple definition of `outcome::succeeded()'
CMakeFiles/ZZZ.dir/main/main.cpp.o:main.cpp:(.text+0x50): first defined here
这些不是专业化。这些都是过载。它们是正则函数,这一点很重要,因为函数模板专门化默认情况下有一些正则函数没有的属性。
例如,模板可以出现在页眉中,因此可以在多个翻译单元中定义而不会出现问题。模板是隐式内联。正则函数需要显式内联。
您的错误表明您在头文件中定义了这些重载。将它包含在多个翻译单元中会导致出现多个定义,并且函数不是内联的,所以这是一个格式错误的程序。
解决方案是将这些重载移动到一个专用的TU,并且只公开它们的声明。或者你可以在标题中内联标记它们:
inline c_out<void> failed(const std::string& error_msg = "") {
c_out<void> outcome;
outcome.success = false;
outcome.error = error_msg;
return outcome;
};
inline c_out<void> succeeded(void) {
c_out<void> outcome;
outcome.success = true;
return outcome;
};
这将在每个TU中吐出一个内联定义。只要所有的定义完全相同(对于头中的函数也是如此(,程序就会形成良好的格式。
1.请确保编译时不要使用不同的文件。例如,如果您将模板类放入一个头文件,将main放入另一个.cpp文件,这可能会导致程序崩溃,因为它正在.cpp文件中搜索模板,而上面给出的情况是不存在的。这可能是问题的原因。
- 有些IDE没有这个问题,所以您可能想尝试另一个IDE,并检查是否出现相同的错误
相关文章:
- .cpp和.h文件中的模板专用化声明
- 调用专用模板时出错"no matching function for call to [...]"
- 模板专用化(按容器):value_type
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- C++中的VLA,扩展名为std=C++11
- 静态数据成员模板专用化的实例化点在哪里
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 带有void类型和参数的C++11模板专用化
- 在可变参数模板类中使用可变参数进行显式专用化 [MSVS '12:12 年 11 月 CTP:错误 C3522]
- C++11 中的可变参数模板专用化
- C++11:模板专用化的 constexpr 成员的标准参考需要额外声明
- C++11中一个专用模板的名称别名
- 返回类型的C++11 方法模板专用化