В программе 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;
};
};
Я хочу специализировать их, когда class 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