当我尝试构建此代码时:
// foo.h
namespace foo {
namespace bar {
void put();
}
}
#include "foo.h"
namespace foo {
namespace {
template<typename T>
void put() { }
}
void bar::put() {
put<int>();
};
}
foo.cpp: In function ‘void foo::bar::put()’:
foo.cpp: error: expected primary-expression before ‘int’
foo.cpp: error: expected ‘;’ before ‘int’
显然,put<int>
正在使用put
来引用bar::put
。如何让它引用匿名命名空间中的put<T>
?
答案 0 :(得分:4)
您可以完全限定功能模板的名称:
namespace foo {
namespace bar {
void put();
}
}
namespace foo {
namespace {
template<typename T>
void put() { }
}
void bar::put() {
::foo::put<int>();
}
}
另请注意,在函数定义之后不需要使用分号。