2012-06-29 65 views
-1

我一直试图迫使实例如下:函数模板实例失败

//A.h 
namespace A { 
    template <typename T> 
    bool foo (B::C<T>, D); 
} 

template bool A::foo<int> (B::C<int>, D); 

//1.cpp 

namespace A { 
template <typename T> 
bool foo (B::C<T>, D) { 
    return false; 
} 
} 




// 2.cpp 
#include "A.h" 

using namespace A; 

void foo() 
{/// 
    ... 
    B::C<int> Alpha; 
    foo(Alpha, Beta); 
} 

的错误我得到的消息是:

C2785:不同的返回类型

C4667:未定义匹配强制实例化的功能模板

这个实例化有什么惊人的错误,因为这些错误消息看起来并不相关。

+0

实现它首先需要在一个文件中定义模板函数。 – gibraltar

+1

您的代码不完整 - “不同的返回类型”错误表明“B :: C”模板类中可能存在问题。 –

+0

我认为代码的错误部分是在实际的实例中。然而,你可能是对的,错误不在这段代码中,因为我重新创建并成功编译了一个类似的例子。 – ozon

回答

-1

这是因为模板是在编译时展开,所以编译器必须知道两者的定义和模板化功能的实现,所以你不能在一个文件中定义的功能,而在另一个

+1

在这种情况下,模板函数被强制实例化,所以它应该实际上工作。 –

+0

您不能在不看到函数定义的情况下强制实例化。这里可能有几个问题? –

+0

@BoPersson - 在原始问题中给出的代码肯定是不完整的--B :: C没有在任何地方定义,1.cpp不包含A.h,因此无法编译。 –