2010-08-22 51 views
3

我在我的代码是这样的:奇怪的多重定义错误

namespace A { 
namespace B { 

void 
GetLine(std::istream& stream, std::string& line) 
{ 
    line.clear(); 
    while (stream.good()) { 
     std::getline(stream, line); 
     boost::trim(line); 
     if (not line.empty()) break; 
    } 
    boost::to_upper(line); 
} 

} 
} 

我也得到多重定义错误,每当我打电话A::B::GetLine。任何想法为什么? (代码在工作,所以如果你需要更多的信息,我会试着给出特定的代码片段,但是我不能只在这里修改整个代码)。

+0

你不能发布编译器错误信息吗?也许它会暗示我们不在上面的代码片段中。 – David 2010-08-22 12:13:50

+2

您是否尝试多次链接目标文件?看看你的makefile,看看包含这个函数的.o是否被多次传递给编译器。我假设你使用的是unix或unix系统,但是你可以做的另一件事是在所有目标文件上运行“nm --demangle”并搜索A :: B :: GetLine以查看它是否在多个.o文件中显示为“已定义”。 – George 2010-08-22 12:14:40

+0

nm为+1 --demangle – Chubsdad 2010-08-22 12:32:44

回答

4

您几乎可以肯定地将代码包含在多个头文件中,而不是在头文件中声明并在源文件中定义。您需要内联声明函数,对其进行模板化,或将定义移动到源文件中,但将声明留在标题中。

+0

非常简单...谢谢! – 2010-08-22 12:29:23

1

您的问题是,您可能在.h文件中包含此代码并将其包含到更多的.cpp文件中。的解决方案是使用inline关键字使编译器内联,然后卸下参考:

namespace A { 
namespace B { 

inline void 
GetLine(std::istream& stream, std::string& line) 
{ 
    line.clear(); 
    while (stream.good()) { 
     std::getline(stream, line); 
     boost::trim(line); 
     if (not line.empty()) break; 
    } 
    boost::to_upper(line); 
} 

} 
} 

另一个解决方案是方法体移动到cpp文件。