C ++命名空间解析

时间:2013-02-28 14:04:41

标签: c++ namespaces unnamed-namespace

当我尝试构建此代码时:

// foo.h
namespace foo {
    namespace bar {
        void put();
    }
}
#include "foo.h"
namespace foo {
    namespace {
        template<typename T>
        void put() { }
    }    
    void bar::put() {
        put<int>();
    };
}

I get the error

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>

1 个答案:

答案 0 :(得分:4)

您可以完全限定功能模板的名称:

namespace foo {
    namespace bar {
        void put();
    }
}

namespace foo {
    namespace {
        template<typename T>
        void put() { }
    }
    void bar::put() {
        ::foo::put<int>();
    }
}

另请注意,在函数定义之后不需要使用分号。