// Copy and paste this section to a .cpp file and try to compile it
// Toggling the ERROR_FLAG macro will enable and disable the code that causes
// the linker error.
#define ERROR_FLAG (1)
template<typename T>
class Compare
{
public:
bool operator () (T const& left, T const& right) const
{
return left < right;
}
};
template<typename T>
class Node
{
public:
};
template<typename T>
class TreeCore
{
public:
};
template<typename T,
typename Comp_t = Compare<T>,
template<typename> class Core_t = TreeCore>
class Tree
{
public:
typedef Node<T> Node_t;
};
template<typename T>
class TestData
{
public:
};
template<template<typename, typename,
template<typename> class> class Tree_t,
template<typename> class Core_t>
class TreeBaseTest
{
public:
// the compiler does not complain about this method
template<typename T, typename Comp1_t, typename Comp2_t>
int verifyContents (
Tree_t<T, Comp1_t, Core_t> const& tree, Comp2_t const& comp,
TestData<T> const* const pData, size_t count) const;
#if (ERROR_FLAG)
// the compiler does not match this decalaration with the definition
template<typename T, typename Comp_t>
int verifyBalance (
typename Tree_t<T, Comp_t, Core_t>::Node_t const* pNode,
int* pHeightOut) const;
#endif
};
template<template<typename, typename,
template<typename> class> class Tree_t,
template<typename> class Core_t>
template<typename T, typename Comp1_t, typename Comp2_t>
int TreeBaseTest<Tree_t, Core_t>::verifyContents (
Tree_t<T, Comp1_t, Core_t> const& tree, Comp2_t const& comp,
TestData<T> const* const pData, size_t count) const
{
return 0;
}
#if (ERROR_FLAG)
// the compiler does not match this definition with the declaration
template<template<typename, typename,
template<typename> class> class Tree_t,
template<typename> class Core_t>
template<typename T, typename Comp_t>
int TreeBaseTest<Tree_t, Core_t>::verifyBalance (
typename Tree_t<T, Comp_t, Core_t>::Node_t const* pNode,
int* pHeightOut) const
{
return 0;
}
#endif
int main ()
{
TreeBaseTest<Tree, TreeCore> treeBaseTest;
Tree<int> tree;
TestData<int> testData[1];
Tree<int>::Node_t node;
int height;
#if (0)
// this won't compile due to previous errors
treeBaseTest.verifyBalance<T, Compare<T> > (&node, &height);
#endif
return treeBaseTest.verifyContents (tree, Compare<int> (), testData, 0);
}
1>------ Build started: Project: TemplateError, Configuration: Debug Win32 ------
1> Main.cpp
1>c:\users\public\documents\programming projects\templateerror\templateerror\main.cpp(86): error C2244: 'TreeBaseTest<Tree_t,Core_t>::verifyBalance' : unable to match function definition to an existing declaration
1> definition
1> 'int TreeBaseTest<Tree_t,Core_t>::verifyBalance(const Tree_t<T,Comp_t,Core_t>::Node_t *,int *) const'
1> existing declarations
1> 'int TreeBaseTest<Tree_t,Core_t>::verifyBalance(const Tree_t<T,Comp1_t,Core_t>::Node_t *,int *) const'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
========== Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========